このページはECMAScript® 2020 Language Specification25 Control Abstraction Objects章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

25.1 反復(Iteration)

25.1.1 共通反復インターフェース(Common Iteration Interfaces)

インターフェイスは、関連付けられた値が特定の仕様に一致するプロパティキーのセットです。 インターフェイス仕様の全てのプロパティを提供するオブジェクトは、そのインターフェイスに準拠している、と言えます。 インターフェイスは、特定のオブジェクトによって表されません。 特定のインターフェースに準拠するオブジェクトが多数存在する場合があります。 一つのオブジェクトで、複数のインターフェイスに準拠する場合もあります。

25.1.1.1 Iterableインターフェース(The Iterable Interface)

Iterableインターフェースには、表65で説明されているプロパティがあります。

表65: Iterableインターフェイスに必要なプロパティ
プロパティ 要件
@@iterator Iteratorオブジェクトを返す関数。 返されるオブジェクトは、Iteratorインターフェースに準拠している必要があります。

25.1.1.2 Iteratorインターフェイス(The Iterator Interface)

Iteratorインターフェースを実装するオブジェクトには、表66のプロパティが必要です。オプションで、表67のプロパティも実装できます。

表66: Iteratorインターフェイスに必要なプロパティ
プロパティ 要件
"next" IteratorResultオブジェクトを返す関数 返されるオブジェクトは、IteratorResultインターフェイスに準拠している必要があります。 Iteratorのnextメソッド呼び出しの結果、IteratorResultオブジェクト"done"プロパティがtrueだった場合、以降のnextメソッド呼び出し結果も、"done"プロパティがtrueである必要があります。 ただし、この要件は強制されません。
next関数に引数が渡される場合がありますが、その解釈と有効性はターゲットのIteratorによって異なります。 for-ofステートメントやIteratorsの一般的な使用方法では引数を渡さないため、for-ofなどのような方法で使用されることが予想されるIteratorオブジェクトは、引数なしで呼び出されることを考慮する必要があります。
表67: Iteratorインターフェイスのオプションプロパティ
プロパティ 要件
"return" IteratorResultオブジェクトを返す関数。 返されるオブジェクトは、IteratorResultインターフェイスに準拠している必要があります。 このメソッドを呼び出すと、今後nextメソッド呼び出しを行う予定がないことがIteratorオブジェクトに通知されます。 通常、返されるIteratorResultオブジェクトには、値がtrue"done"プロパティと、returnメソッドの引数として渡した値がセットされた "value"プロパティがあります。 ただし、この要件は強制されません。
"throw" IteratorResultオブジェクトを返す関数。 返されるオブジェクトは、IteratorResultインターフェイスに準拠している必要があります。 このメソッドを呼び出すと、呼び出し元がエラー状態を検出したことがIteratorオブジェクトに通知されます。 引数はエラー状態を識別するために使用でき、通常は例外オブジェクトになります。 一般的にはメソッド内で、引数として渡された値をスローします。 メソッドがスローしない場合、返されるIteratorResultオブジェクトには通常、値がtrueの"done"プロパティがあります
通常、これらのメソッドの呼び出し元は、呼び出す前にメソッドの存在を確認する必要があります。 for-of、yield *、配列分解などの特定のECMAScript言語機能は、存在チェックを実行した後にこれらのメソッドを呼び出します。 Iterableオブジェクトを引数として受け入れるほとんどのECMAScriptライブラリ関数も、条件付きでそれらを呼び出します。

25.1.1.3 AsyncIterableインターフェース(The AsyncIterable Interface)

AsyncIterableインターフェイスには、表68のプロパティがあります。

表68: AsyncIterableインターフェイスに必要なプロパティ
プロパティ 要件
@@asyncIterator AsyncIteratorオブジェクトを返す関数 返されるオブジェクトは、AsyncIteratorインターフェイスに準拠している必要があります

25.1.1.4 AsyncIteratorインターフェース(The AsyncIterator Interface)

AsyncIteratorインターフェイスを実装するオブジェクトには、表69のプロパティがあります。オプションとして、表70のプロパティも実装できます。

表69: AsyncIteratorインターフェイスに必要なプロパティ
プロパティ 要件
"next" IteratorResultオブジェクトのpromiseを返す関数。 返されるpromiseは、fulfilled時、IteratorResultインターフェイスに準拠するオブジェクトでfulfillされる必要があります。 nextメソッドへの前の呼び出し結果のpromiseの"done"プロパティがtrueの場合、以後のnextメソッドの結果も、"done"の値がtrueである必要があります。 ただし、この要件は強制されません。
nextの関数に引数が渡される場合がありますが、引数の解釈と有効性はターゲットのAsyncIteratorに依存します。 for-await-ofステートメントやAsyncIteratorsなどでは一般的には引数を渡さないため、for-await-ofなどで使用されることが予想される場合、引数なしで呼び出されることを考慮する必要があります。
表70: AsyncIteratorインターフェイスのオプションプロパティ
プロパティ 要件
"return" IteratorResultオブジェクトのpromiseを返す関数 返されるpromiseは、fulfilled時、IteratorResultインターフェイスに準拠するオブジェクトでfulfillされる必要があります。 このメソッドを呼び出すと、今後nextメソッド呼び出しを行う予定がないことをAsyncIteratorオブジェクトに通知します。返されるpromiseは、通常、値がtrue"done"プロパティと、値がreturnメソッドの引数に渡した値である"value"プロパティを持つIteratorResultオブジェクトでfulfillされます。 ただし、この要件は強制されません。

さらに、fulfillment値として機能するIteratorResultオブジェクトには、値がpromise(または"thenable")ではない"value"プロパティが必要です。 引数値が通常の方法で使用されていて、rejectされたpromiseである場合、同じ理由で拒否されたpromiseが返されます。 それがfulfilledされたpromiseである場合、そのfulfillment値を、返されるPromiseのIteratorResultオブジェクトのfulfillmentの"value"プロパティとして使用する必要があります。 ただし、これらの要件も適用されません。

"throw" IteratorResultオブジェクトのpromiseを返す関数 返されるpromiseはfulfilled時、IteratorResultインターフェイス
に準拠するオブジェクトでfulfillされる必要があります。 このメソッドを呼び出すと、呼び出し元がエラー状態を検出したことがAsyncIteratorオブジェクトに通知されます。 引数はエラー状態を識別するために使用でき、通常は例外オブジェクトになります。 一般的には、引数として渡された値でrejectするrejectedされたpromiseを返します。返されたpromiseがfulfilledされると、IteratorResultのfulfill値には通常、値がtrue"done"プロパティが含まれます。 さらに、値がpromise(または"thenable")ではない"value"プロパティが必要です。ただし、この要件は強制されません。
通常、これらのメソッドの呼び出し元は、呼び出す前にメソッドの存在を確認する必要があります。 for-await-ofやyield *などの特定のECMAScript言語機能は、存在チェックを実行した後にこれらのメソッドを呼び出します。

25.1.1.5 IteratorResultインターフェース(The IteratorResult Interface)

IteratorResultインターフェイスには、表71のプロパティがあります。

表71: IteratorResultインターフェイスのプロパティ
プロパティ 要件
"done" trueまたはfalse iteratorのnextメソッド呼び出し結果ステータスです。 反復の終わりに達した場合、"done"プロパティがtrueになります。 終わりに達していない場合、"done"falseで、"value"が使用可能です。 所有または継承された"done"プロパティが存在しない場合、falseと見なされます。
"value" ECMAScript言語値 "done"falseの場合、現在の反復要素の値です。 "done"trueの場合、反復の戻り値です。 反復の戻り値がない場合、値はundefinedです。 このとき、明示的に"value"プロパティを継承していないと、"value"プロパティが存在しない可能性があります。

25.1.2 %IteratorPrototype%オブジェクト(The %IteratorPrototype% Object)

%IteratorPrototype%オブジェクトは、次の特徴があります。

この仕様で定義されている、Iteratorインターフェースを実装するオブジェクトは、%IteratorPrototype% からも継承します。 ECMAScriptコードが、%IteratorPrototype% から継承するオブジェクトを定義する場合もあります。 %IteratorPrototype% オブジェクトは、すべてのイテレーターオブジェクトに適用可能なメソッドを追加できる場所を提供します。

次の式は、ECMAScriptコードが%IteratorPrototype%オブジェクトにアクセスする方法の一例です。

Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))

25.1.2.1 %IteratorPrototype% [ @@iterator ] ( )

次の手順が実行されます。

  1. this値 を返す

この関数の"name"プロパティの値は"[Symbol.iterator]"です。

25.1.3 %AsyncIteratorPrototype%オブジェクト(The %AsyncIteratorPrototype% Object)

%AsyncIteratorPrototype%は、次の特徴があります。

この仕様で定義されている、AsyncIteratorインターフェースを実装するオブジェクトは、%AsyncIteratorPrototype%からも継承します。 ECMAScriptコードが、%AsyncIteratorPrototype%から継承するオブジェクトを定義する場合もあります。 %AsyncIteratorPrototype%オブジェクトは、すべての非同期イテレーターオブジェクトに適用できるメソッドを追加できる場所を提供します。

25.1.3.1 %AsyncIteratorPrototype% [ @@asyncIterator ] ( )

次の手順が実行されます。

  1. this値 を返す

この関数の"name"プロパティの値は"[Symbol.iterator]"です。

25.1.4 Async-from-Syncイテレーターオブジェクト(Async-from-Sync Iterator Objects)

Async-from-Syncイテレーターオブジェクトは、特定の同期イテレーターを適応させる非同期イテレーターです。 Async-from-SyncIteratorオブジェクトに名前付きコンストラクターはありません。 代わりに、CreateAsyncFromSyncIterator抽象操作によって作成されます。

25.1.4.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

抽象操作CreateAsyncFromSyncIteratorは、同期イテレーターレコードから非同期イテレーターレコードを作成するために使用されます。 次の手順を実行します。

  1. ! OrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] ») を asyncIterator とする
  2. syncIteratorRecordasyncIterator.[[SyncIteratorRecord]] にセットする
  3. ! Get(asyncIterator, "next") を nextMethod とする
  4. Record { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false } を iteratorRecord とする
  5. iteratorRecord を返す

25.1.4.2 %AsyncFromSyncIteratorPrototype%オブジェクト(The %AsyncFromSyncIteratorPrototype% Object)

%AsyncFromSyncIteratorPrototype%は、次の特徴があります。

  • すべてのAsync-from-Syncイテレータオブジェクトが継承するプロパティがあります。
  • 通常のオブジェクトです。
  • [[Prototype]]内部スロットがあり、値は%AsyncIteratorPrototype%です。
  • 以下のプロパティがあります。
25.1.4.2.1 %AsyncFromSyncIteratorPrototype%.next ( value )
  1. this値 を O とする
  2. Assert: Type(O) は Object型 で O は [[SyncIteratorRecord]] 内部スロットがある
  3. ! NewPromiseCapability(%Promise%) を promiseCapability とする
  4. O.[[SyncIteratorRecord]] を syncIteratorRecord とする
  5. IteratorNext(syncIteratorRecord, value) を result とする
  6. IfAbruptRejectPromise(result, promiseCapability)
  7. ! AsyncFromSyncIteratorContinuation(result, promiseCapability) を返す
25.1.4.2.2 %AsyncFromSyncIteratorPrototype%.return ( value )
  1. this値 を O とする
  2. Assert: Type(O) は Object型 で O は [[SyncIteratorRecord]] 内部スロットがある
  3. ! NewPromiseCapability(%Promise%) を promiseCapability とする
  4. O.[[SyncIteratorRecord]].[[Iterator]] を syncIterator とする
  5. GetMethod(syncIterator, "return") を return とする
  6. IfAbruptRejectPromise(return, promiseCapability)
  7. returnundefined なら、
    1. ! CreateIterResultObject(value, true) を iterResult とする
    2. ! Call(promiseCapability.[[Resolve]], undefined, « iterResult ») を実行する
    3. promiseCapability.[[Promise]] を返す
  8. Call(return, syncIterator, « value ») を result とする
  9. IfAbruptRejectPromise(result, promiseCapability)
  10. Type(result) が Object型 でないなら、
    1. ! Call(promiseCapability.[[Reject]], undefined, « 新規作成した TypeError object ») を実行する
    2. promiseCapability.[[Promise]] を返す
  11. ! AsyncFromSyncIteratorContinuation(result, promiseCapability) を返す
25.1.4.2.3 %AsyncFromSyncIteratorPrototype%.throw ( value )
  1. this値 を O とする
  2. Assert: Type(O) は Object型 で O は [[SyncIteratorRecord]] 内部スロットがある
  3. ! NewPromiseCapability(%Promise%) を promiseCapability とする
  4. O.[[SyncIteratorRecord]].[[Iterator]] を syncIterator とする
  5. GetMethod(syncIterator, "throw") を throw とする
  6. IfAbruptRejectPromise(throw, promiseCapability)
  7. throwundefined なら、
    1. ! Call(promiseCapability.[[Reject]], undefined, « value ») を実行する
    2. promiseCapability.[[Promise]] を返す
  8. Call(throw, syncIterator, « value ») を result とする
  9. IfAbruptRejectPromise(result, promiseCapability)
  10. Type(result) が Object型 でないなら、
    1. ! Call(promiseCapability.[[Reject]], undefined, « 新規作成した TypeError オブジェクト ») を実行する
    2. promiseCapability.[[Promise]] を返す
  11. ! AsyncFromSyncIteratorContinuation(result, promiseCapability) を返す
25.1.4.2.4 Async-from-Syncイテレータ値アンラップ関数(Async-from-Sync Iterator Value Unwrap Functions)

async-from-syncイテレータ値アンラップ関数は、IteratorResultオブジェクト"value"プロパティを処理時に、AsyncFromSyncIteratorContinuationによって使用される匿名の組み込み関数です。そして、promiseの場合はその値を待機して再パッケージ化します。 結果は、新しい"ラップされていない"IteratorResultオブジェクトになります。 各async-from-syncイテレータ値アンラップ関数には[[Done]]内部スロットがあります。

async-from-syncイテレータ値アンラップ関数が引数valueを使用して呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. ! CreateIterResultObject(value, F.[[Done]]) を返す

25.1.4.3 Async-from-Syncイテレータインスタンスのプロパティ(Properties of Async-from-Sync Iterator Instances)

Async-from-Syncイテレータインスタンスは、%AsyncFromSyncIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクトです。このインスタンスは、最初に表72の内部スロットが作成されます。Async-from-SyncIteratorインスタンスは、ECMAScriptコードから直接アクセスできません。

表72: Async-from-Syncイテレータインスタンスの内部スロット
内部スロット 意味
[[SyncIteratorRecord]] GetIteratorによって返されるレコードで、元の同期イテレーターを表します。

25.1.4.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability )

  1. IteratorComplete(result) を done とする
  2. IfAbruptRejectPromise(done, promiseCapability)
  3. IteratorValue(result) を value とする
  4. IfAbruptRejectPromise(value, promiseCapability)
  5. PromiseResolve(%Promise%, value) を valueWrapper とする
  6. IfAbruptRejectPromise(valueWrapper, promiseCapability)
  7. Async-from-Syncイテレータ値アンラップ関数のアルゴリズムを steps とする
  8. ! CreateBuiltinFunction(steps, « [[Done]] ») を onFulfilled とする
  9. doneonFulfilled.[[Done]] にセットする
  10. ! PerformPromiseThen(valueWrapper, onFulfilled, undefined, promiseCapability) を実行する
  11. promiseCapability.[[Promise]] を返す

25.2 GeneratorFunctionオブジェクト(GeneratorFunction Objects)

GeneratorFunctionオブジェクトは、通常、GeneratorDeclarationGeneratorExpression、およびGeneratorMethodを評価することで作成される関数です。 また、%GeneratorFunction%組み込み関数を呼び出すことで作成することもできます。

画像2:(参考):ジェネレータオブジェクトの関係

25.2.1 GeneratorFunctionコンストラクター(The GeneratorFunction Constructor)

GeneratorFunctionコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%GeneratorFunction%です。
  • 関数として呼び出されたときに、新しいGeneratorFunctionオブジェクトを作成して初期化します。 したがって、関数呼び出しGeneratorFunction(…)は、同じ引数を持つオブジェクト作成式new GeneratorFunction(…)と同等です。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、super呼び出しを含めて、組み込みのGeneratorFunction動作に必要な内部スロットでサブクラスインスタンスを作成および初期化する必要があります。 ジェネレーター関数オブジェクトを定義するためのすべてのECMAScript構文形式は、GeneratorFunctionの直接インスタンスを作成します。 GeneratorFunctionサブクラスのインスタンスを作成するための構文上の手段はありません。

25.2.1.1 GeneratorFunction ( p1, p2, … , pn, body )

最後の引数は、ジェネレーター関数の本体(実行可能コード)を指定します。 先行する引数はすべて仮パラメーターを指定します。
GeneratorFunction関数がいくつかの引数p1p2、…、pnbody(またはnが0の場合、つまりp引数がなく、bodyもない)で呼び出されると、次の手順を実行します。

  1. アクティブ関数オブジェクトC とする
  2. [[Call]]または[[Construct]]によって関数に渡されたargumentsListargs とする
  3. ? CreateDynamicFunction(C, NewTarget, generator, args) を返す
19.2.1.1の備考参照

25.2.2 GeneratorFunctionコンストラクターのプロパティ(Properties of the GeneratorFunction Constructor)

GeneratorFunctionコンストラクターは、次の特徴があります。

25.2.2.1 GeneratorFunction.length

これは、値が1のデータプロパティです。
このプロパティの属性は、 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.2.2.2 GeneratorFunction.prototype

GeneratorFunction.prototypeの初期値は%Generator%です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

25.2.3 GeneratorFunctionプロトタイプオブジェクトのプロパティ(Properties of the GeneratorFunction Prototype Object)

GeneratorFunctionプロトタイプオブジェクトは、次の特徴があります。

  • 通常のオブジェクトです。
  • 関数オブジェクトではありません。[[ECMAScriptCode]]内部スロットまたは表27または表73にリストされている内部スロットを持っていません。
  • %GeneratorFunction%"prototype"プロパティの値です。
  • 組み込みオブジェクト%Generator%です(図2を参照)。
  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。

25.2.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructorの初期値は%GeneratorFunction%です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.2.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototypeの値は、%Generator.prototype%組み込みオブジェクトです。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.2.3.3 GeneratorFunction.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"GeneratorFunction"です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.2.4 GeneratorFunctionインスタンス(GeneratorFunction Instances)

GeneratorFunctionインスタンスはECMAScript関数オブジェクトで、表27にリストされている内部スロットがあります。また、[[IsClassConstructor]]内部スロットの値はfalseです。

各GeneratorFunctionインスタンスには、以下の独自プロパティがあります。

25.2.4.1 length

Functionインスタンス"length"プロパティの仕様(19.2.4.1)が適用されます。

25.2.4.2 name

Functionインスタンス"name"プロパティの仕様(19.2.4.2)が適用されます。

25.2.4.3 prototype

GeneratorFunctionインスタンスが作成されるたびに、通常のオブジェクトが作成され、ジェネレーター関数の"prototype"プロパティの初期値になります。ジェネレーター関数オブジェクトが[[Call]]を使用して呼び出されたとき、新しく作成されたジェネレーターオブジェクトの[[Prototype]]内部スロットを初期化するために "prototype"プロパティの値が使用されます。

このプロパティの属性は{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }です。

Functionインスタンスとは異なり、GeneratorFunctionの"prototype"プロパティの値であるオブジェクトには、値がGeneratorFunctionインスタンスである"constructor"プロパティがありません。

25.3 AsyncGeneratorFunctionオブジェクト(AsyncGeneratorFunction Objects)

AsyncGeneratorFunctionオブジェクトは、通常、AsyncGeneratorDeclarationAsyncGeneratorExpression、およびAsyncGeneratorMethodの構文プロダクションを評価することによって作成される関数です。 また、%AsyncGeneratorFunction%組み込み関数を呼び出すことによって作成することもできます。

25.3.1 AsyncGeneratorFunctionコンストラクター(The AsyncGeneratorFunction Constructor)

AsyncGeneratorFunctionコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%AsyncGeneratorFunction%です。
  • 関数として呼び出されたときに、新しいAsyncGeneratorFunctionオブジェクトを作成して初期化します。 したがって、関数呼び出しAsyncGeneratorFunction(...)は、同じ引数を持つオブジェクト作成式new AsyncGeneratorFunction(...)と同等です。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、組み込みのAsyncGeneratorFunction動作に必要な内部スロットでサブクラスインスタンスを作成および初期化するためにsuper呼び出しを含める必要があります。 非同期ジェネレーター関数オブジェクトを定義するためのすべてのECMAScript構文形式は、AsyncGeneratorFunctionの直接インスタンスを作成します。 AsyncGeneratorFunctionサブクラスのインスタンスを作成する構文上の手段はありません。

25.3.1.1 AsyncGeneratorFunction ( p1, p2, … , pn, body )

最後の引数は、非同期ジェネレーター関数の本体(実行可能コード)を指定します。 先行する引数はすべて仮パラメーターを指定します。

AsyncGeneratorFunction関数がいくつかの引数p1p2、…、pnbody(またはnが0の場合、つまりp引数がなく、bodyも提供されない)で呼び出されたとき、次の手順を実行します。

  1. アクティブ関数オブジェクトC とする
  2. [[Call]]または[[Construct]]によって関数に渡されたargumentsListargs とする
  3. ? CreateDynamicFunction(C, NewTarget, asyncGenerator, args) を返す
19.2.1.1参照

25.3.2 AsyncGeneratorFunctionコンストラクターのプロパティ(Properties of the AsyncGeneratorFunction Constructor)

AsyncGeneratorFunctionコンストラクターは、次の特徴があります。

  • Functionコンストラクターから継承する標準の組み込み関数オブジェクトです。
  • [[Prototype]]内部スロットがあり、値は%Function%です。
  • "name"プロパティがあり、値は "AsyncGeneratorFunction"です。
  • 以下のプロパティがあります。

25.3.2.1 AsyncGeneratorFunction.length

値が1のデータプロパティです。
このプロパティの属性は、{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.3.2.2 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototypeの初期値は、組み込みオブジェクト%AsyncGenerator%です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

25.3.3 AsyncGeneratorFunctionプロトタイプオブジェクトのプロパティ(Properties of the AsyncGeneratorFunction Prototype Object)

AsyncGeneratorFunctionプロトタイプオブジェクトは、次の特徴があります。

25.3.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructorの初期値は%AsyncGeneratorFunction%です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.3.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototypeの値は、%AsyncGenerator.prototype%組み込みオブジェクトです。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.3.3.3 AsyncGeneratorFunction.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"AsyncGeneratorFunction"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.3.4 AsyncGeneratorFunctionインスタンス(AsyncGeneratorFunction Instances)

すべてのAsyncGeneratorFunctionインスタンスはECMAScript関数オブジェクトであり、表27にリストされている内部スロットがあります。また[[IsClassConstructor]]内部スロットの値はfalseです。

各AsyncGeneratorFunctionインスタンスには、次の独自プロパティがあります。

25.3.4.1 length

"length"プロパティの値は、引数として期待される数を示す整数です。 ただし、この言語では、異なる数の引数で関数を呼び出すことができます。 "length"プロパティで指定された数以外の数の引数で呼び出されたときのAsyncGeneratorFunctionの動作は、関数によって異なります。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.3.4.2 name

Functionインスタンス"name"プロパティの仕様(19.2.4.2)が、適用されます。

25.3.4.3 prototype

AsyncGeneratorFunctionインスタンスが作成されるたびに、通常のオブジェクトが作成され、非同期ジェネレーター関数の"prototype"プロパティの初期値になります。[[Call]]を使用してジェネレーター関数オブジェクトが呼び出されたとき、、新しく作成されたAsyncGeneratorオブジェクトの[[Prototype]]内部スロットを初期化するために "prototype"プロパティの値が使用されます。

このプロパティの属性は{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }です。

Functionインスタンスとは異なり、AsyncGeneratorFunctionの"prototype"プロパティの値であるオブジェクトには、値がAsyncGeneratorFunctionインスタンスである"constructor"プロパティがありません。

25.4 Generatorオブジェクト(Generator Objects)

Generatorオブジェクトは、ジェネレーター関数のインスタンスであり、IteratorインターフェースIterableインターフェースの両方に準拠しています。

Generatorインスタンスは、インスタンスを作成したジェネレータ関数の"prototype"プロパティからプロパティを直接継承します。 Generatorインスタンスは、Generatorプロトタイプの組み込み%Generator.prototype%からプロパティを間接的に継承します。

25.4.1 Generatorプロトタイプオブジェクトのプロパティ(Properties of the Generator Prototype Object)

Generatorプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%GeneratorPrototype%です。
  • %Generator%"prototype"プロパティ(GeneratorFunction.prototype)の初期値です。
  • 通常のオブジェクトです。
  • Generatorインスタンスではありません。[[GeneratorState]]内部スロットがありません。
  • [[Prototype]]内部スロットがあり、値は%IteratorPrototype%です。
  • すべてのGeneratorインスタンスが間接的に継承するプロパティがあります。

25.4.1.1 Generator.prototype.constructor

Generator.prototype.constructorの初期値は%Generator%です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.4.1.2 Generator.prototype.next ( value )

次の手順を実行します。

  1. this値 を g とする
  2. ? GeneratorResume(g, value) を返す

25.4.1.3 Generator.prototype.return ( value )

次の手順を実行します。

  1. this値 を g とする
  2. Completion { [[Type]]: return, [[Value]]: value, [[Target]]: empty } を C とする
  3. ? GeneratorResumeAbrupt(g, C) を返す

25.4.1.4 Generator.prototype.throw ( exception )

次の手順を実行します。

  1. this値 を g とする
  2. ThrowCompletion(exception) を C とする
  3. ? GeneratorResumeAbrupt(g, C) を返す

25.4.1.5 Generator.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"Generator"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.4.2 Generatorインスタンスのプロパティ(Properties of Generator Instances)

Generatorインスタンスは、最初に表73で説明されている内部スロットが作成されます。

表73: Generatorインスタンスの内部スロット
内部スロットt 内容
[[GeneratorState]] ジェネレーターの現在の実行状態。 指定可能な値は、undefinedsuspendedStartsuspedYieldexecutecompletedです。
[[GeneratorContext]] ジェネレーターのコードを実行するときに使用される実行コンテキスト

25.4.3 Generatorの抽象演算(Generator Abstract Operations)

25.4.3.1 GeneratorStart ( generator, generatorBody )

引数generatorgeneratorBodyを指定した抽象操作GeneratorStartは、次の手順を実行します。

  1. Assert: generator.[[GeneratorState]] の値は undefined
  2. 実行中の実行コンテキストgenContext とする
  3. generatorgenContextGeneratorコンポーネントにセットする
  4. 実行コンテキストの評価が再開されたときに次の手順が実行されるように、genContextコード評価ステータス設定します。
    1. generatorBody の評価結果を result とする
    2. Assert: ここに戻ったなら、ジェネレーターが例外をスローしたか、暗黙的または明示的なリターンを実行した
    3. 実行コンテキストスタック からgenContextを削除し、実行コンテキストスタックの最上位にある 実行コンテキスト実行中の実行コンテキストとして復元する
    4. completedgenerator.[[GeneratorState]] にセットする
    5. ジェネレータの状態がcompletedになると、それから離れることはなく、関連する実行コンテキストが再開されることもない。generatorに関連付けられている実行状態は、この時点で破棄できる
    6. result.[[Type]] が normal なら、 undefinedresultValue とする
    7. f. と異なり、 result.[[Type]] が return なら result.[[Value]] を resultValue とする
    8. g. と異なるなら、
      1. Assert: result.[[Type]] は throw
      2. Completion(result) を返す
    9. CreateIterResultObject(resultValue, true) を返す
  5. genContextgenerator.[[GeneratorContext]] にセットする
  6. suspendedStartgenerator.[[GeneratorState]] にセットする
  7. NormalCompletion(undefined) を返す

25.4.3.2 GeneratorValidate ( generator )

引数generatorを使用した抽象操作GeneratorValidate は、次の手順を実行します。

  1. ? RequireInternalSlot(generator, [[GeneratorState]]) を実行する
  2. Assert: generator は [[GeneratorContext]] 内部スロットがある
  3. generator.[[GeneratorState]] を state とする
  4. stateexecuting なら、TypeError例外をスローする
  5. state を返す

25.4.3.3 GeneratorResume ( generator, value )

引数generatorvalueを指定した抽象操作GeneratorResumeは、次の手順を実行します。

  1. ? GeneratorValidate(generator) を state とする
  2. statecompleted なら、 CreateIterResultObject(undefined, true) を返す
  3. Assert: statesuspendedStartsuspendedYield
  4. generator.[[GeneratorContext]] を genContext とする
  5. 実行中の実行コンテキストmethodContext とする
  6. Suspend methodContext
  7. executinggenerator.[[GeneratorState]] にセットする
  8. genContext実行コンテキストスタックにプッシュする。genContext実行中の実行コンテキストになる
  9. 一時停止した操作の結果として、NormalCompletion(value)を使用してgenContextの一時停止した評価を再開する。 再開された処理によって返される値を result とする
  10. Assert: ここに戻るとき、genContext実行コンテキストスタックからすでに削除済み。また、methodContext実行中の実行コンテキストになっている
  11. Completion(result) を返す

25.4.3.4 GeneratorResumeAbrupt ( generator, abruptCompletion )

引数generatorabruptCompletionを指定した抽象操作GeneratorResumeAbruptは、次の手順を実行します。

  1. ? GeneratorValidate(generator) を state とする
  2. statesuspendedStart なら、
    1. completedgenerator.[[GeneratorState]] にセットする
    2. ジェネレータの状態がcompletedになると、それから離れることはなく、関連する実行コンテキストが再開されることもない。generator に関連付けられている実行状態は、この時点で破棄できる
    3. completedstate にセットする
  3. statecompleted なら、
    1. abruptCompletion.[[Type]] が return なら、
      1. CreateIterResultObject(abruptCompletion.[[Value]], true) を返す
    2. Completion(abruptCompletion) を返す
  4. Assert: statesuspendedYield
  5. generator.[[GeneratorContext]] を genContext とする
  6. 実行中の実行コンテキストmethodContext とする
  7. Suspend methodContext
  8. executinggenerator.[[GeneratorState]] にセットする
  9. genContext実行コンテキストスタックにプッシュする。genContext実行中の実行コンテキストになる
  10. 一時停止した操作の結果として、abruptCompletionを使用してgenContextの一時停止した評価を再開する。 再開された処理によって返される完了レコードを result とする
  11. Assert: ここに戻るとき、genContext実行コンテキストスタックからすでに削除されている。また、methodContextは、実行中の実行コンテキストになっている
  12. Completion(result) を返す

25.4.3.5 GetGeneratorKind ( )

  1. 実行中の実行コンテキストgenContext とする
  2. genContextGeneratorコンポーネントがないなら、 non-generator を返す
  3. genContextGeneratorコンポーネント を generator とする
  4. generator に [[AsyncGeneratorState]] 内部スロットがあるなら、 async を返す
  5. 4. と異なるなら、 sync を返す

25.4.3.6 GeneratorYield ( iterNextObj )

引数iterNextObjを使用した抽象操作GeneratorYield は、次の手順を実行します。

  1. Assert: iterNextObjIteratorResultインターフェイスを実装するオブジェクト
  2. 実行中の実行コンテキストgenContext とする
  3. Assert: genContext は generator の 実行コンテキスト
  4. genContextGeneratorコンポーネントの値を generator とする
  5. Assert: GetGeneratorKind() は sync
  6. suspendedYieldgenerator.[[GeneratorState]] にセットする
  7. 実行コンテキストスタック から genContext を削除し、実行コンテキストスタックの最上位にある実行コンテキスト実行中の実行コンテキストとして復元する
  8. Completion resumptionValueで評価が再開されたとき、次の手順が実行されるようにgenContextのコード評価ステータスを設定する。
    1. resumptionValue を返す
    2. NOTE: この抽象操作を呼び出したYieldExpressionの評価に戻る
  9. NormalCompletion(iterNextObj) を返す
  10. NOTE: genContextの評価を再開した操作の評価に戻る

25.5 AsyncGeneratorオブジェクト(AsyncGenerator Objects)

AsyncGeneratorオブジェクトは非同期ジェネレーター関数のインスタンスであり、AsyncIteratorインターフェイスAsyncIterableインターフェイスの両方に準拠しています。

AsyncGeneratorインスタンスは、インスタンスを作成したAsyncGenerator関数の"prototype"プロパティを直接継承します。 AsyncGeneratorインスタンスは、AsyncGeneratorプロトタイプ組み込みの%AsyncGenerator.prototype%からプロパティを間接的に継承します。

25.5.1 AsyncGeneratorプロトタイプオブジェクトのプロパティ(Properties of the AsyncGenerator Prototype Object)

AsyncGeneratorプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%AsyncGeneratorPrototype%です。
  • %AsyncGenerator%(AsyncGeneratorFunction.prototype)の"prototype"プロパティの初期値です。
  • 通常のオブジェクトです。
  • AsyncGeneratorインスタンスではありません。[[AsyncGeneratorState]]内部スロットがありません。
  • [[Prototype]]内部スロットがあり、値は%AsyncIteratorPrototype%です。
  • すべてのAsyncGeneratorインスタンスによって間接的に継承されるプロパティがあります。

25.5.1.1 AsyncGenerator.prototype.constructor

AsyncGenerator.prototype.constructorの初期値は%AsyncGenerator%です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.5.1.2 AsyncGenerator.prototype.next ( value )

  1. this値 を generator とする
  2. NormalCompletion(value) を completion とする
  3. ! AsyncGeneratorEnqueue(generator, completion) を返す

25.5.1.3 AsyncGenerator.prototype.return ( value )

  1. this値 を generator とする
  2. Completion { [[Type]]: return, [[Value]]: value, [[Target]]: empty } を completion とする
  3. ! AsyncGeneratorEnqueue(generator, completion) を返す

25.5.1.4 AsyncGenerator.prototype.throw ( exception )

  1. this値 を generator とする
  2. ThrowCompletion(exception) を completion とする
  3. ! AsyncGeneratorEnqueue(generator, completion) を返す

25.5.1.5 AsyncGenerator.prototype [ @@toStringTag ]

@@ toStringTagプロパティの初期値は、文字列値"AsyncGenerator"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.5.2 AsyncGeneratorインスタンスのプロパティ(Properties of AsyncGenerator Instances)

AsyncGeneratorインスタンスは、最初に以下に説明する内部スロットが作成されます。

表74: AsyncGeneratorインスタンスの内部スロット
内部スロット 内容
[[AsyncGeneratorState]] 非同期ジェネレーターの現在の実行状態。 使用可能な値は、undefinedsuspendedStartsupposedYieldexecuteingawaiting-returncompletedです。
[[AsyncGeneratorContext]] 非同期ジェネレーターのコードを実行するときに使用される実行コンテキスト
[[AsyncGeneratorQueue]] 非同期ジェネレーターの再開要求を表すAsyncGeneratorRequestレコードのリスト。

25.5.3 AsyncGenerator Abstract Operations

25.5.3.1 AsyncGeneratorRequestレコード(AsyncGeneratorRequest Records)

AsyncGeneratorRequestは、非同期ジェネレーターを再開する方法に関する情報を格納するためのRecord値です。対応するpromiseを実行または拒否する機能が含まれています。

次のフィールドがあります。

表75: AsyncGeneratorRequestレコードのフィールド
フィールド名 意味
[[Completion]] Completion レコード 非同期ジェネレーターを再開するために使用する値
[[Capability]] PromiseCapabilityレコード リクエストに関連するpromise機能。

25.5.3.2 AsyncGeneratorStart ( generator, generatorBody )

  1. Assert: generatorAsyncGeneratorインスタンス
  2. Assert: generator.[[AsyncGeneratorState]] は undefined
  3. 実行中の実行コンテキストgenContext とする
  4. generatorgenContextGeneratorコンポーネント にセットする
  5. 実行コンテキスト の評価再開時に、次の手順が実行されるように genContextのコード評価ステータスを設定する
    1. generatorBody の評価結果を result とする
    2. Assert: こに戻ったなら、非同期ジェネレーターは例外をスローしたか、暗黙的または明示的なリターンを実行した。
    3. 実行コンテキストスタックからgenContextを削除し、実行コンテキストスタックの最上位にある実行コンテキスト実行中の実行コンテキストとして復元する
    4. completedgenerator.[[AsyncGeneratorState]] にセットする
    5. result が正常完了なら、 undefinedresultValue とする
    6. e. と異なるなら、
      1. result.[[Value]] を resultValue とする
      2. result.[[Type]] が return でないなら、
        1. ! AsyncGeneratorReject(generator, resultValue) を返す
    7. ! AsyncGeneratorResolve(generator, resultValue, true) を返す
  6. genContextgenerator.[[AsyncGeneratorContext]] にセットする
  7. suspendedStartgenerator.[[AsyncGeneratorState]] にセットする
  8. 空の新規Listgenerator.[[AsyncGeneratorQueue]] にセットする
  9. undefined を返す

25.5.3.3 AsyncGeneratorResolve ( generator, value, done )

  1. Assert: generatorAsyncGeneratorインスタンス
  2. generator.[[AsyncGeneratorQueue]] を queue とする
  3. Assert: queueempty Listではない
  4. queue の最初の要素を削除し、その要素の値を next とする
  5. next.[[Capability]] を promiseCapability とする
  6. ! CreateIterResultObject(value, done) を iteratorResult とする
  7. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する
  8. ! AsyncGeneratorResumeNext(generator) を実行する
  9. undefined を返す

25.5.3.4 AsyncGeneratorReject ( generator, exception )

  1. Assert: generatorAsyncGeneratorインスタンス
  2. generator.[[AsyncGeneratorQueue]] を queue とする
  3. Assert: queueempty List ではない
  4. queue の最初の要素を削除し、その要素の値を next とする
  5. next.[[Capability]] を promiseCapability とする
  6. ! Call(promiseCapability.[[Reject]], undefined, « exception ») を実行する
  7. ! AsyncGeneratorResumeNext(generator) を実行する
  8. undefined を返す

25.5.3.5 AsyncGeneratorResumeNext ( generator )

  1. Assert: generatorAsyncGeneratorインスタンス
  2. generator.[[AsyncGeneratorState]] を state とする
  3. Assert: stateexecuting ではない
  4. stateawaiting-return なら、 undefined を返す
  5. generator.[[AsyncGeneratorQueue]] を queue とする
  6. queueempty List なら、 undefined を返す
  7. queue の最初の要素の値を next とする
  8. Assert: nextAsyncGeneratorRequestレコード
  9. next.[[Completion]] を completion とする
  10. completion突然の完了 なら、
    1. statesuspendedStart なら、
      1. completedgenerator.[[AsyncGeneratorState]] にセットする
      2. completedstate にセットする
    2. statecompleted なら、
      1. completion.[[Type]] が return なら、
        1. awaiting-returngenerator.[[AsyncGeneratorState]] にセットする
        2. ? PromiseResolve(%Promise%, completion.[[Value]]) を promise とする
        3. AsyncGeneratorResumeNext Return Processor Fulfilled 関数で定義されたアルゴリズムステップを stepsFulfilled とする
        4. ! CreateBuiltinFunction(stepsFulfilled, « [[Generator]] ») を onFulfilled とする
        5. generatoronFulfilled.[[Generator]] にセットする
        6. AsyncGeneratorResumeNext Return Processor Rejected関数で定義されたアルゴリズムステップを stepsRejected とする
        7. ! CreateBuiltinFunction(stepsRejected, « [[Generator]] ») を onRejected とする
        8. generatoronRejected.[[Generator]] にセットする
        9. ! PerformPromiseThen(promise, onFulfilled, onRejected) を実行する
        10. undefined を返す
      2. i. と異なるなら、
        1. Assert: completion.[[Type]] は throw
        2. ! AsyncGeneratorReject(generator, completion.[[Value]]) を実行する
        3. undefined を返す
  11. 10. と異なり、 statecompleted なら ! AsyncGeneratorResolve(generator, undefined, true) を返す
  12. Assert: statesuspendedStartsuspendedYield
  13. generator.[[AsyncGeneratorContext]] を genContext とする
  14. 実行中の実行コンテキストcallerContext とする
  15. Suspend callerContext
  16. executinggenerator.[[AsyncGeneratorState]] にセットする
  17. genContext実行コンテキストスタックにプッシュする。genContext実行中の実行コンテキストになる
  18. 一時停止した操作の結果として、completionを使用してgenContextの一時停止した評価を再開する。 再開された処理によって返される完了レコードを result とする
  19. Assert: result突然の完了 にならない
  20. Assert: ここに戻ったなら、genContextはすでに実行コンテキストスタックから削除されており、callerContext実行中の実行コンテキストである
  21. undefined を返す
25.5.3.5.1 AsyncGeneratorResumeNext Return Processor Fulfilled関数(Functions)

AsyncGeneratorResumeNext Return Processor Fulfilled関数は、AsyncGenerator.prototype.return(value)メソッドに渡されたpromiseをアンラップするためにAsyncGeneratorResumeNext仕様デバイスの一部として使用される匿名の組み込み関数です。この関数には、[[Generator]]内部スロットがあります。

この関数が引数valueを使用して呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. completedF.[[Generator]].[[AsyncGeneratorState]] にセットする
  3. ! AsyncGeneratorResolve(F.[[Generator]], value, true) を返す

この関数の "length" プロパティは 1 です。

25.5.3.5.2 AsyncGeneratorResumeNext Return Processor Rejected関数(Functions)

AsyncGeneratorResumeNext Return Processor Rejected関数は、AsyncGenerator.prototype.return(value)メソッドに渡されたpromiseをアンラップするためにAsyncGeneratorResumeNext仕様デバイスの一部として使用される匿名の組み込み関数です。 この関数には、[[Generator]]内部スロットがあります。

この関数が引数reasonを使用して呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. completedF.[[Generator]].[[AsyncGeneratorState]] にセットする
  3. ! AsyncGeneratorReject(F.[[Generator]], reason) を返す

この関数の "length" プロパティは 1 です。

25.5.3.6 AsyncGeneratorEnqueue ( generator, completion )

  1. Assert: completion完了レコード
  2. ! NewPromiseCapability(%Promise%) を promiseCapability とする
  3. Type(generator) が Object型 でない、 または generator に [[AsyncGeneratorState]] 内部スロットがないなら、
    1. 新規作成した TypeError オブジェクトを badGeneratorError とする
    2. ! Call(promiseCapability.[[Reject]], undefined, « badGeneratorError ») を実行する
    3. promiseCapability.[[Promise]] を返す
  4. generator.[[AsyncGeneratorQueue]] を queue とする
  5. AsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability } を request とする
  6. requestqueue の最後に追加する
  7. generator.[[AsyncGeneratorState]] を state とする
  8. stateexecuting でないなら、
    1. ! AsyncGeneratorResumeNext(generator) を実行する
  9. promiseCapability.[[Promise]] を返す

25.5.3.7 AsyncGeneratorYield ( value )

引数valueを使用した抽象操作AsyncGeneratorYield は、次の手順を実行します。

  1. 実行中の実行コンテキストgenContext とする
  2. Assert: genContext は generatorの 実行コンテキスト
  3. genContextGeneratorコンポーネントの値を generator とする
  4. Assert: GetGeneratorKind() は async
  5. ? Await(value) を value にセットする
  6. suspendedYieldgenerator.[[AsyncGeneratorState]] にセットする
  7. 実行コンテキストスタックからgenContextを削除し、実行コンテキストスタックの最上位にある実行コンテキスト実行中の実行コンテキストとして復元する
  8. Completion resumptionValueで評価が再開されたとき、次の手順が実行されるように genContextのコード評価ステータスを設定する
    1. resumptionValue.[[Type]] が return でないなら、 Completion(resumptionValue) を返す
    2. Await(resumptionValue.[[Value]]) を awaited とする
    3. awaited.[[Type]] が throw なら、 Completion(awaited) を返す
    4. Assert: awaited.[[Type]] は normal
    5. Completion { [[Type]]: return, [[Value]]: awaited.[[Value]], [[Target]]: empty } を返す
    6. NOTE:上記のステップのいずれかのreturnは、最初にこの抽象操作を呼び出したYieldExpressionプロダクションの評価に戻る
  9. ! AsyncGeneratorResolve(generator, value, false) を返す
  10. NOTE: genContextの評価を再開した操作の評価に戻る

25.6 Promiseオブジェクト(Promise Objects)

Promiseは、遅延(および場合によっては非同期)処理の最終結果のプレースホルダーとして使用されるオブジェクトです。

Promiseオブジェクトは、相互に排他的な3つの状態(fulfilledrejectedpending)のいずれかになります。

  • p.then(f,r) がすぐにジョブをキューに入れて関数fを呼び出す場合、promise pfulfilledです。
  • p.then(f,r) がすぐにジョブをキューに入れて関数rを呼び出す場合、promise prejectedです。
  • fulfilledでもrejectedでもない場合、promiseはpendingです

Promiseはpendingでない場合、つまり、fulfilledまたはrejectedされた場合に解決されたことになります。

Promiseが解決された場合、または別のPromiseの状態と一致するように"locked in"された場合、約束はresolveされます。 resolveされたプロミスをresolveまたはrejectしようとしても効果はありません。 Promiseがresolveされない場合、Promiseは未解決です。 未解決のプロミスの状態は常にpendingです。 resolveされたPromiseは、pendingfulfilled、またはrejectedになる場合があります。

25.6.1 Promise抽象演算(Promise Abstract Operations)

25.6.1.1 PromiseCapabilityレコード(PromiseCapability Records)

PromiseCapabilityは、Promiseオブジェクトをresolveまたはrejectできる関数とともにカプセル化するために使用されるRecord値です。 PromiseCapabilityレコードは、NewPromiseCapability抽象操作によって生成されます。

PromiseCapabilityレコードには、次のフィールドがあります。

表76: PromiseCapabilityレコードのフィールド
フィールド名 意味
[[Promise]] オブジェクト型 promiseとして使用できるオブジェクト。
[[Resolve]] 関数オブジェクト promiseオブジェクトをresolveするために使用される関数。
[[Reject]] 関数オブジェクト promiseオブジェクトをrejectするために使用される関数。
25.6.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromiseは、PromiseCapabilityレコードレコードを使用する一連のアルゴリズムステップの省略形です。

次の形式のアルゴリズムステップは、

  1. IfAbruptRejectPromise(value, capability)

次と同じ意味を持ちます。

  1. value突然の完了 なら、
    1. ? Call(capability.[[Reject]], undefined, « value.[[Value]] ») を実行する
    2. capability.[[Promise]] を返す
  2. 2. と異なり、 value完了レコード なら value.[[Value]] を value にセットする

25.6.1.2 PromiseReactionレコード(PromiseReaction Records)

PromiseReactionは、Promiseが特定の値で resolveまたはrejectされたときに、Promiseがどのように反応するかに関する情報を格納するために使用されるレコード値です。 PromiseReactionレコードは、PerformPromiseThen抽象操作によって作成され、NewPromiseReactionJobによって返される抽象クロージャによって使用されます。

PromiseReactionレコードには、次のフィールドがあります。

表77: PromiseReactionレコードのフィールド
フィールド名 意味
[[Capability]] PromiseCapabilityレコード
またはundefined
このレコードがリアクションハンドラーを提供するPromiseCapability
[[Type]] Fulfill | Reject [[Type]]は、[[Handler]]がundefinedの場合に使用され、解決時に固有の動作をおこないます。
[[Handler]] 関数オブジェクト
またはundefined
受け取った値に適用する関数で、その戻り値によって派生したpromiseに対する動作が制御されます。
[[Handler]]がundefinedの場合、[[Type]]の値に依存する関数が使用されます。

25.6.1.3 CreateResolvingFunctions ( promise )

CreateResolvingFunctionsが引数promiseを使用して実行されると、次の手順が実行されます。

  1. Record { [[Value]]: false } を alreadyResolved とする
  2. Promise Resolve関数 のアルゴリズムステップを stepsResolve とする
  3. ! CreateBuiltinFunction(stepsResolve, « [[Promise]], [[AlreadyResolved]] ») を resolve とする
  4. promiseresolve.[[Promise]] にセットする
  5. alreadyResolvedresolve.[[AlreadyResolved]] にセットする
  6. Promise Reject関数 のアルゴリズムステップを stepsReject とする
  7. ! CreateBuiltinFunction(stepsReject, « [[Promise]], [[AlreadyResolved]] ») を reject とする
  8. promisereject.[[Promise]] にセットする
  9. alreadyResolvedreject.[[AlreadyResolved]] にセットする
  10. Record { [[Resolve]]: resolve, [[Reject]]: reject } を返す
25.6.1.3.1 Promise Reject関数(Functions)

promise reject関数は、[[Promise]]と[[AlreadyResolved]]の内部スロットを持つ匿名の組み込み関数です。

引数reasonを指定して呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. Assert: F は値がオブジェクト型の [[Promise]] 内部スロットがある
  3. F.[[Promise]] を promise とする
  4. F.[[AlreadyResolved]] を alreadyResolved とする
  5. alreadyResolved.[[Value]] が true なら、 undefined を返す
  6. truealreadyResolved.[[Value]] にセットする
  7. RejectPromise(promise, reason) を返す

この関数の "length" プロパティは 1 です。

25.6.1.3.2 Promise Resolve関数(Functions)

Promise Resolve関数は、[[Promise]]と[[AlreadyResolved]]の内部スロットを持つ匿名の組み込み関数です。

引数 resolution で呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. Assert: F は値がオブジェクト型の [[Promise]] 内部スロットがある
  3. F.[[Promise]] を promise とする
  4. F.[[AlreadyResolved]] を alreadyResolved とする
  5. alreadyResolved.[[Value]] が true なら、 undefined を返す
  6. truealreadyResolved.[[Value]] にセットする
  7. SameValue(resolution, promise) が true なら、
    1. 新規作成した TypeError オブジェクト を selfResolutionError とする
    2. RejectPromise(promise, selfResolutionError) を返す
  8. Type(resolution) が Object型 でないなら、
    1. FulfillPromise(promise, resolution) を返す
  9. Get(resolution, "then") を then とする
  10. then突然の完了 なら、
    1. RejectPromise(promise, then.[[Value]]) を返す
  11. then.[[Value]] を thenAction とする
  12. IsCallable(thenAction) が false なら、
    1. FulfillPromise(promise, resolution) を返す
  13. NewPromiseResolveThenableJob(promise, resolution, thenAction) を job とする
  14. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する
  15. undefined を返す

この関数の "length" プロパティは 1 です。

25.6.1.4 FulfillPromise ( promise, value )

FulfillPromise抽象演算が引数promisevalueを指定して呼び出されると、次の手順が実行されます。

  1. Assert: promise.[[PromiseState]] の値は pending
  2. promise.[[PromiseFulfillReactions]] を reactions とする
  3. valuepromise.[[PromiseResult]] にセットする
  4. undefinedpromise.[[PromiseFulfillReactions]] にセットする
  5. undefinedpromise.[[PromiseRejectReactions]] にセットする
  6. fulfilledpromise.[[PromiseState]] にセットする
  7. TriggerPromiseReactions(reactions, value) を返す

25.6.1.5 NewPromiseCapability ( C )

抽象操作NewPromiseCapabilityはコンストラクター関数を受け取り、そのコンストラクター関数を組み込みのPromiseコンストラクターで使用してPromiseオブジェクトを作成し、resolve関数とreject関数を抽出します。 promiseとresolveおよびreject関数は、この抽象操作の値として返される新しいPromiseCapabilityレコードを初期化するために使用されます。

  1. IsConstructor(C) が false なら、TypeError例外をスローする
  2. NOTE: Cは、Promiseコンストラクターのパラメーター規則をサポートするコンストラクター関数であると見なす(25.6.3.1
  3. PromiseCapability { [[Promise]]: undefined, [[Resolve]]: undefined, [[Reject]]: undefined } を promiseCapability とする
  4. GetCapabilitiesExecutor関数 のアルゴリズムステップを steps とする
  5. ! CreateBuiltinFunction(steps, « [[Capability]] ») を executor とする
  6. promiseCapabilityexecutor.[[Capability]] にセットする
  7. ? Construct(C, « executor ») を promise とする
  8. IsCallable(promiseCapability.[[Resolve]]) が false なら、TypeError例外をスローする
  9. IsCallable(promiseCapability.[[Reject]]) が false なら、TypeError例外をスローする
  10. promisepromiseCapability.[[Promise]] にセットする
  11. promiseCapability を返す
この抽象操作は、Promiseサブクラス化をサポートします(Promiseコンストラクターと同じ方法で渡された実行関数を呼び出すコンストラクターが汎用的であるため)。 これは、Promiseコンストラクターの静的メソッドを任意のサブクラスに一般化するために使用されます。
25.6.1.5.1 GetCapabilitiesExecutor関数(Functions)

GetCapabilitiesExecutor関数は、[[Capability]]内部スロットを持つ匿名の組み込み関数です。

GetCapabilitiesExecutor関数が引数resolveおよびrejectを指定して呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. Assert: F は値がPromiseCapabilityレコードの [[Capability]] 内部スロットがある
  3. F.[[Capability]] を promiseCapability とする
  4. promiseCapability.[[Resolve]] が undefined でないなら、TypeError例外をスローする
  5. promiseCapability.[[Reject]] が undefined でないなら、TypeError例外をスローする
  6. resolvepromiseCapability.[[Resolve]] にセットする
  7. rejectpromiseCapability.[[Reject]] にセットする
  8. undefined を返す

この関数の "length" プロパティは 2 です。

25.6.1.6 IsPromise ( x )

抽象操作IsPromiseは、オブジェクトがpromisかどうかをチェックします。

  1. Type(x) が Object型 でないなら、 false を返す
  2. x に [[PromiseState]] 内部スロットがないなら false を返す
  3. true を返す

25.6.1.7 RejectPromise ( promise, reason )

引数promisereasonを指定してRejectPromise抽象操作が呼び出されると、次の手順が実行されます。

  1. Assert: promise.[[PromiseState]] の値は pending
  2. promise.[[PromiseRejectReactions]] を reactions とする
  3. reasonpromise.[[PromiseResult]] にセットする
  4. undefinedpromise.[[PromiseFulfillReactions]] にセットする
  5. undefinedpromise.[[PromiseRejectReactions]] にセットする
  6. rejectedpromise.[[PromiseState]] にセットする
  7. promise.[[PromiseIsHandled]] が false なら HostPromiseRejectionTracker(promise, "reject") を実行する
  8. TriggerPromiseReactions(reactions, reason) を返す

25.6.1.8 TriggerPromiseReactions ( reactions, argument )

抽象操作TriggerPromiseReactionsは、PromiseReactionレコードのコレクションを取得し、レコードごとに新しいジョブをキューに入れます。 各ジョブは、PromiseReactionレコードの[[Type]]と[[Handler]]を処理し、[[Handler]]が関数の場合は、指定された引数を渡して呼び出します。 [[Handler]]が未定義の場合、動作は[[Type]]によって決定されます。

  1. reactions の 各要素を reaction とし、元の挿入順で reaction ごとに次を実行する
    1. NewPromiseReactionJob(reaction, argument) を job とする
    2. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する
  2. undefined を返す

25.6.1.9 HostPromiseRejectionTracker ( promise, operation )

HostPromiseRejectionTrackerは、ホスト環境がPromiseのrejectを追跡できるようにする、実装定義の抽象操作です。

この操作の実装は、すべての場合で正常に完了する必要があります。 この操作のデフォルトの実装は、空の通常の完了を無条件に返すことです。

HostPromiseRejectionTrackerは、次の2つのシナリオで呼び出されます。

  • ハンドラーなしでpromiseがrejectされたとき、引数operation"reject"に設定されて呼び出されます。
  • rejectされたpromiseにハンドラーが初めて追加されたとき、引数operation"handle"に設定されて呼び出されます。

HostPromiseRejectionTrackerの一般的な実装では、未処理のrejectを開発者に通知しようとしますが、そのような以前の通知が後で新しいハンドラーがアタッチされて無効になった場合にも注意して通知します。

operation"handle"である場合、実装はガベージコレクションを妨げるような方法でpromiseへの参照を保持するべきではありません。 実装は、operation"reject"である場合にpromiseへの参照を保持する場合があります。これは、rejectがまれであり、ホットコードパス上ではないことが予想されるためです。

25.6.2 Promiseジョブ(Promise Jobs)

25.6.2.1 NewPromiseReactionJob ( reaction, argument )

抽象操作NewPromiseReactionJobは、reactionargumentの2つの引数を取ります。そして着信値に適切なハンドラーを適用する新しいジョブ抽象クロージャを返します。さらに、ハンドラーの戻り値を使用して、そのハンドラーに関連付けられた派生promiseをresolveまたはrejectします。 次の手順を実行します。

  1. reactionargumentをキャプチャし、呼び出されたときに次の手順を実行するパラメータのない新しいジョブ抽象クロージャを、job とする
    1. Assert: reactionPromiseReactionレコード
    2. reaction.[[Capability]] を promiseCapability とする
    3. reaction.[[Type]] を type とする
    4. reaction.[[Handler]] を handler とする
    5. handlerundefined なら、
      1. typeFulfill なら、 NormalCompletion(argument) を handlerResult とする
      2. i. と異なるなら、
        1. Assert: typeReject
        2. ThrowCompletion(argument) を handlerResult とする
    6. e. と異なるなら、 Call(handler, undefined, « argument ») を handlerResult とする
    7. promiseCapabilityundefined なら、
      1. Assert: handlerResult突然の完了 ではない
      2. NormalCompletion(empty) を返す
    8. handlerResult突然の完了 なら、
      1. Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] ») を status とする
    9. h. と異なるなら、
      1. Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] ») を status とする
    10. Completion(status) を返す
  2. nullhandlerRealm とする
  3. reaction.[[Handler]] が undefined でないなら、
    1. GetFunctionRealm(reaction.[[Handler]]) を getHandlerRealmResult とする
    2. getHandlerRealmResult が a normal completion なら、 getHandlerRealmResult.[[Value]] を handlerRealm にセットする
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm } を返す

25.6.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

抽象操作NewPromiseResolveThenableJobは、promiseToResolvethenablethenの3つの引数を取り、次の手順を実行します。

  1. promiseToResolvethenablethenをキャプチャし、呼び出されたときに次の手順を実行するパラメーターのない新しいジョブ抽象クロージャを、jobとする
    1. CreateResolvingFunctions(promiseToResolve) を resolvingFunctions とする
    2. Call(then, thenable, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] ») を thenCallResult とする
    3. thenCallResult突然の完了 なら、
      1. Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] ») を status とする
      2. Completion(status) を返す
    4. Completion(thenCallResult) を返す
  2. GetFunctionRealm(then) を getThenRealmResult とする
  3. getThenRealmResult が正常完了なら、 getThenRealmResult.[[Value]] を thenRealm とする
  4. 異なるなら nullthenRealm とする
  5. Record { [[Job]]: job, [[Realm]]: thenRealm } を返す
このジョブは、指定されたthenableとそのthenメソッドを使用して、指定されたpromiseをresolveします。 このプロセスは、周囲のコードの評価が完了した後にthenメソッドの評価が確実に行われるように、ジョブとして実行する必要があります。

25.6.3 Promiseコンストラクター(The Promise Constructor)

Promiseコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%Promise%です。
  • グローバルオブジェクトの"Promise"プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいPromiseオブジェクトを作成して初期化します。
  • 関数として呼び出されると例外がスローされます。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。サブクラスコンストラクターには、PromiseおよびPromise.prototype組み込みメソッドをサポートしサブクラスインスタンスを作成および初期化するためにsuper呼び出しを含める必要があります。

25.6.3.1 Promise ( executor )

Promise が引数 executor で呼び出されると、次の手順が実行されます。

  1. NewTargetundefined なら、TypeError例外をスローする
  2. IsCallable(executor) が false なら、TypeError例外をスローする
  3. ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») を promise とする
  4. pendingpromise.[[PromiseState]] にセットする
  5. 空の新規Listpromise.[[PromiseFulfillReactions]] にセットする
  6. 空の新規Listpromise.[[PromiseRejectReactions]] にセットする
  7. falsepromise.[[PromiseIsHandled]] にセットする
  8. CreateResolvingFunctions(promise) を resolvingFunctions とする
  9. Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] ») を completion とする
  10. completion突然の完了 なら、
    1. ? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] ») を実行する
  11. promise を返す
引数executor関数オブジェクトである必要があります。 それは、このPromiseオブジェクトによって表される遅延の可能性のあるアクションの完了を、その実行と報告のために呼び出されます。
executorは、resolverejectの2つの引数で呼び出されます。 2つの引数は、延期された処理の最終的な完了または失敗を報告するためにexecutor関数によって使用される可能性のある関数です。 executor関数から戻るということは、延期されたアクションが完了したことを意味するのではなく、最終的に延期されたアクションを実行する要求が受け入れられたことを意味します。executor関数に渡されるresolve関数は、単一の引数を受け入れます。executorのコードは、最終的にresolve関数を呼び出して、関連付けられたPromiseオブジェクトを解決したいことを示します。 resolve関数に渡される引数は、遅延アクションの最終的な値を表し、実際のフルフィルメント値、またはフルフィルメントされた場合に値を提供する別のPromiseオブジェクトのいずれかになります。

executor関数に渡されるreject関数は、単一の引数を受け入れます。 executorのコードは、最終的にreject関数を呼び出して、関連付けられたPromiseが拒否され、実行されないことを示します。 reject関数に渡された引数は、promiseの拒否値として使用されます。 通常、これはErrorオブジェクトになります。

Promiseコンストラクターによってexecutor関数に渡されるresolveおよびreject関数には、関連するpromiseを実際にresolveおよびrejectする機能があります。 サブクラスには、resolveとrejectのカスタマイズされた値を渡す異なるコンストラクター動作がある場合があります

25.6.4 Promiseコンストラクターのプロパティ(Properties of the Promise Constructor)

Promiseコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
  • 次のプロパティがあります。

25.6.4.1 Promise.all ( iterable )

all関数は、渡されたpromiseのフルフィルメント値の配列でfulfilledされる新しいpromiseを返すか、最初に渡されたpromiseがrejectされた時点でrejectします。 このアルゴリズムを実行すると、渡されたiterableのすべての要素がpromiseで解決されます。

  1. this値 を C とする
  2. ? NewPromiseCapability(C) を promiseCapability とする
  3. GetIterator(iterable) を iteratorRecord とする
  4. IfAbruptRejectPromise(iteratorRecord, promiseCapability)
  5. PerformPromiseAll(iteratorRecord, C, promiseCapability) を result とする
  6. result突然の完了 なら、
    1. iteratorRecord.[[Done]] が false なら IteratorClose(iteratorRecord, result) を result にセットする
    2. IfAbruptRejectPromise(result, promiseCapability)
  7. Completion(result) を返す

この関数は、%Promise_all%組み込みオブジェクトです。

all関数は、this値がPromiseコンストラクターのパラメーター規則をサポートするコンストラクター関数である必要があります。
25.6.4.1.1 ランタイムセマンティクス(Runtime Semantics): PerformPromiseAll ( iteratorRecord, constructor, resultCapability )

PerformPromiseAll抽象操作が引数iteratorRecordconstructorresultCapabilityを指定して呼び出されると、次の手順が実行されます。

  1. Assert: IsConstructor(constructor) は true
  2. Assert: resultCapabilityPromiseCapabilityレコード
  3. 空の新規Listvalues とする
  4. Record { [[Value]]: 1 } を remainingElementsCount とする
  5. ? Get(constructor, "resolve") を promiseResolve とする
  6. ! IsCallable(promiseResolve) が false なら、TypeError例外をスローする
  7. 0 を index とする
  8. 繰り返す
    1. IteratorStep(iteratorRecord) を next とする
    2. next突然の完了 なら trueiteratorRecord.[[Done]] にセットする
    3. ReturnIfAbrupt(next)
    4. nextfalse なら、
      1. trueiteratorRecord.[[Done]] にセットする
      2. remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
      3. remainingElementsCount.[[Value]] が 0 なら、
        1. ! CreateArrayFromList(values) を valuesArray とする
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する
      4. resultCapability.[[Promise]] を返す
    5. IteratorValue(next) を nextValue とする
    6. nextValue突然の完了 なら trueiteratorRecord.[[Done]] にセットする
    7. ReturnIfAbrupt(nextValue)
    8. valuesundefined を追加する
    9. ? Call(promiseResolve, constructor, « nextValue ») を nextPromise とする
    10. Promise.all Resolve Element関数のアルゴリズムステップを steps とする
    11. ! CreateBuiltinFunction(steps, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») を resolveElement とする
    12. Record { [[Value]]: false } を resolveElement.[[AlreadyCalled]] にセットする
    13. indexresolveElement.[[Index]] にセットする
    14. valuesresolveElement.[[Values]] にセットする
    15. resultCapabilityresolveElement.[[Capability]] にセットする
    16. remainingElementsCountresolveElement.[[RemainingElements]] にセットする
    17. remainingElementsCount.[[Value]] + 1 を remainingElementsCount.[[Value]] にセットする
    18. ? Invoke(nextPromise, "then", « resolveElement, resultCapability.[[Reject]] ») を実行する
    19. index + 1 を index にセットする
25.6.4.1.2 Promise.all Resolve Element関数(Functions)

Promise.all Resolve Element関数は、特定のPromise.all要素を解決するために使用される匿名の組み込み関数です。 この関数には、[[Index]]、[[Values]]、[[Capability]]、[[RemainingElements]]、[[AlreadyCalled]]の内部スロットがあります。

この関数が引数xで呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. F.[[AlreadyCalled]] を alreadyCalled とする
  3. alreadyCalled.[[Value]] が true なら、 undefined を返す
  4. truealreadyCalled.[[Value]] にセットする
  5. F.[[Index]] を index とする
  6. F.[[Values]] を values とする
  7. F.[[Capability]] を promiseCapability とする
  8. F.[[RemainingElements]] を remainingElementsCount とする
  9. xvalues[index] にセットする
  10. remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
  11. remainingElementsCount.[[Value]] が 0 なら、
    1. ! CreateArrayFromList(values) を valuesArray とする
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す
  12. undefined を返す

この関数の "length" プロパティは 1 です。

25.6.4.2 Promise.allSettled ( iterable )

allSettled関数は、promiseステータスのスナップショットの配列に対して解決するpromiseを返します。ただし、元のpromiseがすべて解決された後、つまりfulfilledまたはrejectされた後でのみ返されます。 このアルゴリズムを実行すると、渡されたすべてのpromise要素が解決されます。

  1. this値 を C とする
  2. ? NewPromiseCapability(C) を promiseCapability とする
  3. GetIterator(iterable) を iteratorRecord とする
  4. IfAbruptRejectPromise(iteratorRecord, promiseCapability)
  5. PerformPromiseAllSettled(iteratorRecord, C, promiseCapability) を result とする
  6. result突然の完了 なら、
    1. iteratorRecord.[[Done]] が false なら IteratorClose(iteratorRecord, result) を result にセットする
    2. IfAbruptRejectPromise(result, promiseCapability)
  7. Completion(result) を返す
allSettled関数では、this値がPromiseコンストラクターのパラメーター規則をサポートするコンストラクター関数である必要があります。
25.6.4.2.1 ランタイムセマンティクス(Runtime Semantics): PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability )

PerformPromiseAllSettled抽象操作が引数iteratorRecordconstructorresultCapabilityを指定して呼び出されると、次の手順が実行されます。

  1. Assert: ! IsConstructor(constructor) は true
  2. Assert: resultCapabilityPromiseCapabilityレコード
  3. 空の新規Listvalues とする
  4. Record { [[Value]]: 1 } を remainingElementsCount とする
  5. 0 を index とする
  6. ? Get(constructor, "resolve") を promiseResolve とする
  7. IsCallable(promiseResolve) が false なら、TypeError例外をスローする
  8. 繰り返す
    1. IteratorStep(iteratorRecord) を next とする
    2. next突然の完了 なら trueiteratorRecord.[[Done]] にセットする
    3. ReturnIfAbrupt(next)
    4. nextfalse なら、
      1. trueiteratorRecord.[[Done]] にセットする
      2. remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
      3. remainingElementsCount.[[Value]] が 0 なら、
        1. ! CreateArrayFromList(values) を valuesArray とする
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する
      4. resultCapability.[[Promise]] を返す
    5. IteratorValue(next) を nextValue とする
    6. nextValue突然の完了 なら trueiteratorRecord.[[Done]] にセットする
    7. ReturnIfAbrupt(nextValue)
    8. valuesundefined を追加する
    9. ? Call(promiseResolve, constructor, « nextValue ») を nextPromise とする
    10. Promise.allSettled Resolve Element関数 のアルゴリズムステップを steps とする
    11. ! CreateBuiltinFunction(steps, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») を resolveElement とする
    12. Record { [[Value]]: false } を alreadyCalled とする
    13. alreadyCalledresolveElement.[[AlreadyCalled]] にセットする
    14. indexresolveElement.[[Index]] にセットする
    15. valuesresolveElement.[[Values]] にセットする
    16. resultCapabilityresolveElement.[[Capability]] にセットする
    17. remainingElementsCountresolveElement.[[RemainingElements]] にセットする
    18. Promise.allSettled Reject Element関数 のアルゴリズムステップを rejectSteps とする
    19. ! CreateBuiltinFunction(rejectSteps, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») を rejectElement とする
    20. alreadyCalledrejectElement.[[AlreadyCalled]] にセットする
    21. indexrejectElement.[[Index]] にセットする
    22. valuesrejectElement.[[Values]] にセットする
    23. resultCapabilityrejectElement.[[Capability]] にセットする
    24. remainingElementsCountrejectElement.[[RemainingElements]] にセットする
    25. remainingElementsCount.[[Value]] + 1 を remainingElementsCount.[[Value]] にセットする
    26. ? Invoke(nextPromise, "then", « resolveElement, rejectElement ») を実行する
    27. index + 1 を index にセットする
25.6.4.2.2 Promise.allSettled Resolve Element関数(Functions)

Promise.allSettled Resolve Element関数は、特定のPromise.allSettled要素を解決するために使用される匿名の組み込み関数です。 この関数には、[[Index]]、[[Values]]、[[Capability]]、[[RemainingElements]]、[[AlreadyCalled]]の内部スロットがあります。

この関数が引数 x で呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. F.[[AlreadyCalled]] を alreadyCalled とする
  3. alreadyCalled.[[Value]] が true なら、 undefined を返す
  4. truealreadyCalled.[[Value]] にセットする
  5. F.[[Index]] を index とする
  6. F.[[Values]] を values とする
  7. F.[[Capability]] を promiseCapability とする
  8. F.[[RemainingElements]] を remainingElementsCount とする
  9. ! OrdinaryObjectCreate(%Object.prototype%) を obj とする
  10. ! CreateDataPropertyOrThrow(obj, "status", "fulfilled") を実行する
  11. ! CreateDataPropertyOrThrow(obj, "value", x) を実行する
  12. objvalues[index] にセットする
  13. remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
  14. remainingElementsCount.[[Value]] が 0 なら、
    1. ! CreateArrayFromList(values) を valuesArray とする
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す
  15. undefined を返す

この関数の "length" プロパティは 1 です。

25.6.4.2.3 Promise.allSettled Reject Element関数(Functions)

Promise.allSettled Reject Element関数は、特定のPromise.allSettled要素を拒否するために使用される匿名の組み込み関数です。 この関数には、[[Index]]、[[Values]]、[[Capability]]、[[RemainingElements]]、[[AlreadyCalled]]の内部スロットがあります。

この関数が引数 x で呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. F.[[AlreadyCalled]] を alreadyCalled とする
  3. alreadyCalled.[[Value]] が true なら、 undefined を返す
  4. truealreadyCalled.[[Value]] にセットする
  5. F.[[Index]] を index とする
  6. F.[[Values]] を values とする
  7. F.[[Capability]] を promiseCapability とする
  8. F.[[RemainingElements]] を remainingElementsCount とする
  9. ! OrdinaryObjectCreate(%Object.prototype%) を obj とする
  10. ! CreateDataPropertyOrThrow(obj, "status", "rejected") を実行する
  11. ! CreateDataPropertyOrThrow(obj, "reason", x) を実行する
  12. objvalues[index] にセットする
  13. remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
  14. remainingElementsCount.[[Value]] が 0 なら、
    1. ! CreateArrayFromList(values) を valuesArray とする
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す
  15. undefined を返す

この関数の "length" プロパティは 1 です。

25.6.4.3 Promise.prototype

Promise.prototypeの初期値は%Promise.prototype%です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

25.6.4.4 Promise.race ( iterable )

race関数は、最初に解決したpromiseと同じ結果で解決される新しいpromiseを返します。 このアルゴリズムを実行すると、渡されたiterableのすべての要素がpromiseで解決されます。

  1. this値 を C とする
  2. ? NewPromiseCapability(C) を promiseCapability とする
  3. GetIterator(iterable) を iteratorRecord とする
  4. IfAbruptRejectPromise(iteratorRecord, promiseCapability)
  5. PerformPromiseRace(iteratorRecord, C, promiseCapability) を result とする
  6. result突然の完了 なら、
    1. iteratorRecord.[[Done]] が false なら IteratorClose(iteratorRecord, result) を result にセットする
    2. IfAbruptRejectPromise(result, promiseCapability)
  7. Completion(result) を返す
iterable引数が空の場合、またはiterable内のどのpromiseも解決されない場合、このメソッドによって返される保留中のPromiseは解決されません。
race関数は、this値がPromiseコンストラクターのパラメーター規則をサポートするコンストラクター関数である必要があります。 また、this値は解決メソッドを提供するべきです。
25.6.4.4.1 ランタイムセマンティクス(Runtime Semantics): PerformPromiseRace ( iteratorRecord, constructor, resultCapability )

PerformPromiseRace抽象操作が引数iteratorRecordconstructor、およびresultCapabilityを指定して呼び出されると、次の手順が実行されます。

  1. Assert: IsConstructor(constructor) は true
  2. Assert: resultCapabilityPromiseCapabilityレコード
  3. ? Get(constructor, "resolve") を promiseResolve とする
  4. ! IsCallable(promiseResolve) が false なら、TypeError例外をスローする
  5. 繰り返す
    1. IteratorStep(iteratorRecord) を next とする
    2. next突然の完了, trueiteratorRecord.[[Done]] にセットする
    3. ReturnIfAbrupt(next)
    4. nextfalse なら、
      1. trueiteratorRecord.[[Done]] にセットする
      2. resultCapability.[[Promise]] を返す
    5. IteratorValue(next) を nextValue とする
    6. nextValue突然の完了 なら trueiteratorRecord.[[Done]] にセットする
    7. ReturnIfAbrupt(nextValue)
    8. ? Call(promiseResolve, constructor, « nextValue ») を nextPromise とする
    9. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») を実行する

25.6.4.5 Promise.reject ( r )

reject関数は、渡された引数でrejectされた新しいpromiseを返します。

  1. this値 を C とする
  2. ? NewPromiseCapability(C) を promiseCapability とする
  3. ? Call(promiseCapability.[[Reject]], undefined, « r ») を実行する
  4. promiseCapability.[[Promise]] を返す

この関数は、%Promise_reject%組み込みオブジェクトです。

reject関数は、thisの値がPromiseコンストラクターのパラメーター規則をサポートするコンストラクター関数である必要があります。

25.6.4.6 Promise.resolve ( x )

resolve関数は、渡された引数でresolveされた新しいpromiseを返すします。ただし、引数がコンストラクターによって生成されたpromiseである場合は引数自体を返します。

  1. this値 を C とする
  2. Type(C) が Object型でないなら、TypeError例外をスローする
  3. ? PromiseResolve(C, x) を返す

この関数は、%Promise_resolve%組み込みオブジェクトです。

resolve関数は、thisの値がPromiseコンストラクターのパラメーター規則をサポートするコンストラクター関数である必要があります。
25.6.4.6.1 PromiseResolve ( C, x )

コンストラクターCと値xが与えられた抽象操作PromiseResolveは、xで解決された新しいpromiseを返します。

  1. Assert: Type(C) は Object型
  2. IsPromise(x) が true なら、
    1. ? Get(x, "constructor") を xConstructor とする
    2. SameValue(xConstructor, C) が true なら、 x を返す
  3. ? NewPromiseCapability(C) を promiseCapability とする
  4. ? Call(promiseCapability.[[Resolve]], undefined, « x ») を実行する
  5. promiseCapability.[[Promise]] を返す

25.6.4.7 get Promise [ @@species ]

Promise[@@species]はsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を返す

この関数の"name"プロパティの値は"get [Symbol.species]"です。

Promiseプロトタイプメソッドは通常、このオブジェクトのコンストラクターを使用して派生オブジェクトを作成します。 ただし、サブクラスコンストラクターは、@@speciesプロパティを再定義することでそのデフォルトの動作をオーバーライドできます。

25.6.5 Promiseプロトタイプオブジェクトのプロパティ(Properties of the Promise Prototype Object)

Promiseプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%PromisePrototype%です。
  • [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
  • 通常のオブジェクトです。
  • [[PromiseState]]内部スロットまたはPromiseインスタンスの他の内部スロットがありません。

25.6.5.1 Promise.prototype.catch ( onRejected )

catch が引数 onRejected で呼び出されると、次の手順が実行されます。

  1. this値 を promise とする
  2. ? Invoke(promise, "then", « undefined, onRejected ») を返す

25.6.5.2 Promise.prototype.constructor

Promise.prototype.constructorの初期値は%Promise%です。

25.6.5.3 Promise.prototype.finally ( onFinally )

finally が引数 onFinally で呼び出されると、次の手順が実行されます。

  1. this値 を promise とする
  2. Type(promise) が Object型でないなら、TypeError例外をスローする
  3. ? SpeciesConstructor(promise, %Promise%) を C とする
  4. Assert: IsConstructor(C) は true
  5. IsCallable(onFinally) が false なら、
    1. onFinallythenFinally とする
    2. onFinallycatchFinally とする
  6. 5. と異なるなら、
    1. Then Finally関数 のアルゴリズムステップを stepsThenFinally とする
    2. ! CreateBuiltinFunction(stepsThenFinally, « [[Constructor]], [[OnFinally]] ») を thenFinally とする
    3. CthenFinally.[[Constructor]] にセットする
    4. onFinallythenFinally.[[OnFinally]] にセットする
    5. Catch Finally関数 のアルゴリズムステップを stepsCatchFinally とする
    6. ! CreateBuiltinFunction(stepsCatchFinally, « [[Constructor]], [[OnFinally]] ») を catchFinally とする
    7. CcatchFinally.[[Constructor]] にセットする
    8. onFinallycatchFinally.[[OnFinally]] にセットする
  7. ? Invoke(promise, "then", « thenFinally, catchFinally ») を返す
25.6.5.3.1 Then Finally関数(Functions)

Then Finally関数は、[[Constructor]]と[[OnFinally]]の内部スロットを持つ匿名の組み込み関数です。 [[Constructor]]内部スロットの値はPromiseのようなコンストラクター関数オブジェクトであり、[[OnFinally]]内部スロットの値は関数オブジェクトです。

この関数が引数 value で呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. F.[[OnFinally]] を onFinally とする
  3. Assert: IsCallable(onFinally) は true
  4. ? Call(onFinally, undefined) を result とする
  5. F.[[Constructor]] を C とする
  6. Assert: IsConstructor(C) は true
  7. ? PromiseResolve(C, result) を promise とする
  8. value を返す関数と同等なものを valueThunk とする
  9. ? Invoke(promise, "then", « valueThunk ») を返す

この関数の "length" プロパティは 1 です。

25.6.5.3.2 Catch Finally関数(Functions)

Catch Finally関数は、[[Constructor]]と[[OnFinally]]の内部スロットを持つ匿名の組み込み関数です。 [[Constructor]]内部スロットの値はPromiseのようなコンストラクター関数オブジェクトであり、[[OnFinally]]内部スロットの値は関数オブジェクトです。

この関数が引数 reason で呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトF とする
  2. F.[[OnFinally]] を onFinally とする
  3. Assert: IsCallable(onFinally) は true
  4. ? Call(onFinally, undefined) を result とする
  5. F.[[Constructor]] を C とする
  6. Assert: IsConstructor(C) は true
  7. ? PromiseResolve(C, result) を promise とする
  8. reason をスローする関数と同等なものを thrower とする
  9. ? Invoke(promise, "then", « thrower ») を返す

この関数の "length" プロパティは 1 です。

25.6.5.4 Promise.prototype.then ( onFulfilled, onRejected )

thenメソッドが引数onFulfilledおよびonRejectedを指定して呼び出されると、次の手順が実行されます。

  1. this値 を promise とする
  2. IsPromise(promise) が false なら、TypeError例外をスローする
  3. ? SpeciesConstructor(promise, %Promise%) を C とする
  4. ? NewPromiseCapability(C) を resultCapability とする
  5. PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability) を返す

この関数は、%PromiseProto_then%組み込みオブジェクトです。

25.6.5.4.1 PerformPromiseThen ( promise, onFulfilled, onRejected [ , resultCapability ] )

抽象操作PerformPromiseThenは、解決アクションとしてonFulfilledおよびonRejectedを使用して、promiseで"then"操作を実行します。 resultCapabilityが渡されると、resultCapabilityのpromiseを更新して結果が保存されます。 渡されない場合、PerformPromiseThenは、結果が重要ではない仕様内部操作によって呼び出されます。

  1. Assert: IsPromise(promise) は true
  2. resultCapability が 存在するなら、
    1. Assert: resultCapabilityPromiseCapabilityレコード
  3. 2. と異なるなら、
    1. undefinedresultCapability にセットする
  4. IsCallable(onFulfilled) が false なら、
    1. undefinedonFulfilled にセットする
  5. IsCallable(onRejected) が false なら、
    1. undefinedonRejected にセットする
  6. PromiseReaction { [[Capability]]: resultCapability, [[Type]]: Fulfill, [[Handler]]: onFulfilled } を fulfillReaction とする
  7. PromiseReaction { [[Capability]]: resultCapability, [[Type]]: Reject, [[Handler]]: onRejected } を rejectReaction とする
  8. promise.[[PromiseState]] が pending なら、
    1. promise.[[PromiseFulfillReactions]] の最後に fulfillReaction を追加する
    2. Listthat is promise.[[PromiseRejectReactions]] の最後に rejectReaction を追加する
  9. 8. と異なり、 promise.[[PromiseState]] is fulfilled なら、
    1. promise.[[PromiseResult]] を value とする
    2. NewPromiseReactionJob(fulfillReaction, value) を fulfillJob とする
    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]) を実行する
  10. 9. と異なるなら、
    1. Assert: promise.[[PromiseState]] の値は rejected
    2. promise.[[PromiseResult]] を reason とする
    3. promise.[[PromiseIsHandled]] が false なら HostPromiseRejectionTracker(promise, "handle") を実行する
    4. NewPromiseReactionJob(rejectReaction, reason) を rejectJob とする
    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]]) を実行する
  11. truepromise.[[PromiseIsHandled]] にセットする
  12. resultCapabilityundefined なら、
    1. undefined を返す
  13. 12. と異なるなら、
    1. resultCapability.[[Promise]] を返す

25.6.5.5 Promise.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"Promise"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.6.6 Promiseインスタンスのプロパティ(Properties of Promise Instances)

Promiseインスタンスは、Promiseプロトタイプオブジェクト(組み込みの%Promise.prototype%)からプロパティを継承する通常のオブジェクトです。 Promiseインスタンスは、最初に表78の内部スロットが作成されます。

表78: Promiseインスタンスの内部スロット
内部スロット 内容
[[PromiseState]] pendingfulfilledrejectedのいずれか。 promiseがthenメソッドへの着信呼び出しにどのように反応するかを管理します。
[[PromiseResult]] promiseがfulfilledまたはrejectedされた場合の値。 [[PromiseState]]がpendingでない場合にのみ意味があります。
[[PromiseFulfillReactions]] Promiseがpendingからfulfilled移行時に処理されるPromiseReactionレコードのリスト。
[[PromiseRejectReactions]] promiseがpendingからrejected移行時に処理されるPromiseReactionレコードのリスト。
[[PromiseIsHandled]] プロミスにフルフィルメントハンドラーまたはrejectionハンドラーがあるかどうかを示すブール値。 未処理のrejection追跡で使用されます。

25.7 AsyncFunctionオブジェクト(AsyncFunction Objects)

AsyncFunctionオブジェクトは、通常、AsyncFunctionDeclarationAsyncFunctionExpressionAsyncMethod、およびAsyncArrowFunctionを評価することによって作成される関数です。 また、%AsyncFunction%組み込み関数を呼び出すことで作成することもできます。

25.7.1 AsyncFunctionコンストラクター(The AsyncFunction Constructor)

AsyncFunctionコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%AsyncFunction%です。
  • Functionのサブクラスです。
  • 関数として呼び出されると、新しいAsyncFunctionオブジェクトを作成して初期化します。 したがって、関数呼び出しAsyncFunction(…)は、同じ引数を持つオブジェクト作成式new AsyncFunction(…)と同等です。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、組み込みの非同期関数動作に必要な内部スロットとともにサブクラスインスタンスを作成および初期化するために、super呼び出しを含める必要があります。

25.7.1.1 AsyncFunction ( p1, p2, … , pn, body )

最後の引数は、非同期関数の本体(実行可能コード)を指定します。 上記の引数はすべて仮パラメーターを指定します。

AsyncFunction関数がいくつかの引数p1p2、…、pnbodynが0の場合、つまりp引数がなく、bodyも提供されない場合)で呼び出されると、次の手順が実行されます。

  1. アクティブ関数オブジェクトC とする
  2. [[Call]]または[[Construct]]によってこの関数に渡されたargumentsListargs とする
  3. CreateDynamicFunction(C, NewTarget, async, args) を返す
19.2.1.1参照

25.7.2 AsyncFunctionコンストラクターのプロパティ(Properties of the AsyncFunction Constructor)

AsyncFunctionコンストラクターは、次の特徴があります。

  • Functionコンストラクターから継承する標準の組み込み関数オブジェクトです。
  • [[Prototype]]内部スロットがあり、値は%Function%です。
  • "name" プロパティがあり、値は"AsyncFunction"です。
  • 以下のプロパティがあります。

25.7.2.1 AsyncFunction.length

これは、値が1のデータプロパティです。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.7.2.2 AsyncFunction.prototype

AsyncFunction.prototypeの初期値は%AsyncFunction.prototype%です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

25.7.3 AsyncFunctionプロトタイプオブジェクトのプロパティ(Properties of the AsyncFunction Prototype Object)

AsyncFunctionプロトタイプオブジェクトは、次の特徴があります。

  • 通常のオブジェクトです。
  • 関数オブジェクトではありません。[[ECMAScriptCode]]内部スロットまたは表27にリストされているその他の内部スロットを持っていません。
  • %AsyncFunction%の"prototype"プロパティの値です。
  • 組み込みオブジェクト%AsyncFunctionPrototype%です。
  • [[Prototype]]内部スロットがあり、値は%Function.prototype%です。

25.7.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructorの初期値は%AsyncFunction%です。

このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.7.3.2 AsyncFunction.prototype [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"AsyncFunction"です。

このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。

25.7.4 AsyncFunctionインスタンス(AsyncFunction Instances)

AsyncFunctionインスタンスはECMAScript関数オブジェクトであり、表27にリストされている内部スロットがあります。[[IsClassConstructor]]内部スロットの値はfalseです。 AsyncFunctionインスタンスはコンストラクターではなく、[[Construct]]内部メソッドを持っていません。 AsyncFunctionインスタンスは構築できないため、プロトタイププロパティはありません。

各AsyncFunctionインスタンスには、次の独自のプロパティがあります。

25.7.4.1 length

Functionインスタンスの "length"プロパティの仕様(19.2.4.1)が、AsyncFunctionインスタンスにも適用されます。

25.7.4.2 name

Functionインスタンスの "name"プロパティの仕様(19.2.4.2)が、AsyncFunctionインスタンスにも適用されます。

25.7.5 Async関数抽象演算(Async Functions Abstract Operations)

25.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody )

  1. 実行中の実行コンテキストrunningContext とする
  2. runningContext の a copy を asyncContext とする
  3. NOTE: 以下の手順で実行を再開するには、実行状態をコピーする必要がある。 現在実行中のコンテキストを再開することについては明確に定義していない
  4. 実行コンテキストの評価が再開されたときに次の手順が実行されるように、asyncContextのコード評価状態を設定する
    1. asyncFunctionBody の評価結果を result とする
    2. Assert: ここに戻ったなら、非同期関数が例外をスローしたか、暗黙的または明示的な戻りを実行した。 待機はすべて完了した。
    3. 実行コンテキストスタックからasyncContextを削除し、実行コンテキストスタックの最上位にある実行コンテキスト実行中の実行コンテキストとして復元する
    4. result.[[Type]] が normal なら、
      1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行する
    5. d. と異なり、 result.[[Type]] が return なら、
      1. ! Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] ») を実行する
    6. e. と異なるなら、
      1. Assert: result.[[Type]] は throw
      2. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») を実行する
    7. Returnする
  5. asyncContext実行コンテキストスタックにプッシュする。asyncContext実行中の実行コンテキストになる
  6. asyncContextの一時停止された評価を再開する。 再開された処理によって返される値を result とする
  7. Assert: ここに戻ったなら、asyncContextは実行コンテキストスタックからすでに削除されており、runningContextは現在実行中の実行コンテキストである
  8. Assert: result は値がundefinedの通常の完了。完了値の可能なソースはAwait、または、async関数が何も待機しない場合は、上記のステップ4.g
  9. Returnする