27 制御抽象オブジェクト

27.1 反復

27.1.1 共通反復インターフェイス

インターフェイスとは、関連付けられた値が特定の仕様に一致するプロパティキーの集合である。インターフェイスの仕様で記述されているすべてのプロパティを提供する任意のオブジェクトは、そのインターフェイスに適合する。インターフェイスは、個別のオブジェクトによって表されるものではない。任意のインターフェイスに適合する、別々に実装されたオブジェクトは多数存在し得る。個々のオブジェクトは複数のインターフェイスに適合し得る。

27.1.1.1 Iterable インターフェイス

iterable インターフェイスは、Table 78 に記述されるプロパティを含む:

Table 78: Iterable インターフェイスの必須プロパティ
プロパティ 要件
%Symbol.iterator% iterator オブジェクトを返す関数 返されるオブジェクトは iterator インターフェイスに適合しなければならない。

27.1.1.2 Iterator インターフェイス

iterator インターフェイスを実装するオブジェクトは、Table 79 のプロパティを含まなければならない。そのようなオブジェクトは、Table 80 のプロパティも実装してよい。

Table 79: Iterator インターフェイスの必須プロパティ
プロパティ 要件
"next" IteratorResult オブジェクトを返す関数 返されるオブジェクトは IteratorResult インターフェイスに適合しなければならない。iteratornext メソッドへの以前の呼び出しが、"done" プロパティの値が true である IteratorResult オブジェクトを返した場合、そのオブジェクトの next メソッドへの以後のすべての呼び出しも、"done" プロパティの値が true である IteratorResult オブジェクトを返すべきである。ただし、この要件は強制されない。
Note 1

next 関数に引数を渡してもよいが、その解釈と妥当性は対象の iterator に依存する。for-of 文および iterator のその他の一般的な利用者は引数を渡さないため、そのような方法で使用されることを想定する iterator オブジェクトは、引数なしで呼び出されることに対処できるようにしておかなければならない。

Table 80: Iterator インターフェイスのオプションプロパティ
プロパティ 要件
"return" IteratorResult オブジェクトを返す関数 返されるオブジェクトは IteratorResult インターフェイスに適合しなければならない。このメソッドを呼び出すことは、呼び出し元がその iterator に対してこれ以上 next メソッド呼び出しを行う意図がないことを iterator オブジェクトに通知する。返される IteratorResult オブジェクトは通常、値が true である "done" プロパティと、return メソッドの引数として渡された値を持つ "value" プロパティを持つ。ただし、この要件は強制されない。
"throw" IteratorResult オブジェクトを返す関数 返されるオブジェクトは IteratorResult インターフェイスに適合しなければならない。このメソッドを呼び出すことは、呼び出し元がエラー条件を検出したことを iterator オブジェクトに通知する。引数はそのエラー条件を識別するために使用され得、通常は例外オブジェクトである。典型的な応答は、引数として渡された値を throw することである。メソッドが throw しない場合、返される IteratorResult オブジェクトは通常、値が true である "done" プロパティを持つ。
Note 2

通常、これらのメソッドの呼び出し元は、それらを呼び出す前に存在を確認するべきである。for-ofyield*、および配列分割代入を含む特定の ECMAScript 言語機能は、存在確認を行った後にこれらのメソッドを呼び出す。iterable オブジェクトを引数として受け取るほとんどの ECMAScript ライブラリ関数も、それらを条件付きで呼び出す。

27.1.1.3 Async Iterable インターフェイス

async iterable インターフェイスは、Table 81 に記述されるプロパティを含む:

Table 81: Async Iterable インターフェイスの必須プロパティ
プロパティ 要件
%Symbol.asyncIterator% async iterator オブジェクトを返す関数 返されるオブジェクトは async iterator インターフェイスに適合しなければならない。

27.1.1.4 Async Iterator インターフェイス

async iterator インターフェイスを実装するオブジェクトは、Table 82 のプロパティを含まなければならない。そのようなオブジェクトは、Table 83 のプロパティも実装してよい。

Table 82: Async Iterator インターフェイスの必須プロパティ
プロパティ 要件
"next" IteratorResult オブジェクトに対する promise を返す関数

返される promise は、履行されたとき、IteratorResult インターフェイスに適合するオブジェクトで履行されなければならない。async iteratornext メソッドへの以前の呼び出しが、"done" プロパティの値が true である IteratorResult オブジェクトに対する promise を返した場合、そのオブジェクトの next メソッドへの以後のすべての呼び出しも、"done" プロパティの値が true である IteratorResult オブジェクトに対する promise を返すべきである。ただし、この要件は強制されない。

さらに、履行値として機能する IteratorResult オブジェクトは、値が promise(または「thenable」)ではない "value" プロパティを持つべきである。ただし、この要件も強制されない。

Note 1

next 関数に引数を渡してもよいが、その解釈と妥当性は対象の async iterator に依存する。for-await-of 文および async iterator のその他の一般的な利用者は引数を渡さないため、そのような方法で使用されることを想定する async iterator オブジェクトは、引数なしで呼び出されることに対処できるようにしておかなければならない。

Table 83: Async Iterator インターフェイスのオプションプロパティ
プロパティ 要件
"return" IteratorResult オブジェクトに対する promise を返す関数

返される promise は、履行されたとき、IteratorResult インターフェイスに適合するオブジェクトで履行されなければならない。このメソッドを呼び出すことは、呼び出し元がその async iterator に対してこれ以上 next メソッド呼び出しを行う意図がないことを async iterator オブジェクトに通知する。返される promise は、通常、値が true である "done" プロパティと、return メソッドの引数として渡された値を持つ "value" プロパティを持つ IteratorResult オブジェクトで履行される。ただし、この要件は強制されない。

さらに、履行値として機能する IteratorResult オブジェクトは、値が promise(または「thenable」)ではない "value" プロパティを持つべきである。引数値が典型的な方法で使用される場合、それが拒否された promise であれば、同じ理由で拒否された promise が返されるべきであり、それが履行された promise であれば、その履行値が返される promise の IteratorResult オブジェクト履行値の "value" プロパティとして使用されるべきである。ただし、これらの要件も強制されない。

"throw" IteratorResult オブジェクトに対する promise を返す関数

返される promise は、履行されたとき、IteratorResult インターフェイスに適合するオブジェクトで履行されなければならない。このメソッドを呼び出すことは、呼び出し元がエラー条件を検出したことを async iterator オブジェクトに通知する。引数はそのエラー条件を識別するために使用され得、通常は例外オブジェクトである。典型的な応答は、引数として渡された値で拒否される拒否済み promise を返すことである。

返される promise が履行された場合、IteratorResult オブジェクト履行値は通常、値が true である "done" プロパティを持つ。さらに、それは値が promise(または「thenable」)ではない "value" プロパティを持つべきであるが、この要件は強制されない。

Note 2

通常、これらのメソッドの呼び出し元は、それらを呼び出す前に存在を確認するべきである。for-await-of および yield* を含む特定の ECMAScript 言語機能は、存在確認を行った後にこれらのメソッドを呼び出す。

27.1.1.5 IteratorResult インターフェイス

IteratorResult インターフェイスは、Table 84 に列挙されるプロパティを含む:

Table 84: IteratorResult インターフェイスプロパティ
プロパティ 要件
"done" Boolean これは iteratornext メソッド呼び出しの結果状態である。iterator の終端に到達した場合、"done"true である。終端に到達していない場合、"done"false であり、値が利用可能である。"done" プロパティ(独自または継承)が存在しない場合、それは値 false を持つとみなされる。
"value" ECMAScript 言語値 done が false であれば、これは現在の反復要素値である。done が true であれば、これは iterator が提供した場合の iterator の return 値である。iterator が return 値を持たない場合、"value"undefined である。その場合、適合するオブジェクトが明示的な "value" プロパティを継承していなければ、"value" プロパティは存在しなくてもよい。

27.1.2 Iterator Helper オブジェクト

Iterator Helper オブジェクトは、特定のソース iterator オブジェクトの遅延変換を表す通常のオブジェクトである。Iterator Helper オブジェクト用の名前付きコンストラクターは存在しない。代わりに、Iterator Helper オブジェクトは Iterator インスタンスオブジェクトの特定のメソッドを呼び出すことによって作成される。

27.1.2.1 %IteratorHelperPrototype% オブジェクト

%IteratorHelperPrototype% オブジェクト:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

  1. GeneratorResume(this value, undefined, "Iterator Helper") を返す。

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. objthis value とする。
  2. RequireInternalSlot(obj, [[UnderlyingIterators]]) を実行する。
  3. Assert: obj[[GeneratorState]] 内部スロットを持つ。
  4. obj.[[GeneratorState]]suspended-start であるならば、
    1. obj.[[GeneratorState]]completed に設定する。
    2. NOTE: generator が completed 状態に入ると、それは二度とその状態を離れず、関連付けられた実行コンテキストは二度と再開されない。この時点で、obj に関連付けられた任意の実行状態は破棄できる。
    3. IteratorCloseAll(obj.[[UnderlyingIterators]], NormalCompletion(unused)) を実行する。
    4. CreateIteratorResultObject(undefined, true) を返す。
  5. completionReturnCompletion(undefined) とする。
  6. GeneratorResumeAbrupt(obj, completion, "Iterator Helper") を返す。

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "Iterator Helper" である。

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

27.1.3 Iterator オブジェクト

27.1.3.1 Iterator コンストラクター

Iterator コンストラクター:

  • %Iterator% である。
  • グローバルオブジェクト"Iterator" プロパティの初期値である。
  • サブクラス化できるように設計されている。クラス定義の extends 節の値として使用できる。

27.1.3.1.1 Iterator ( )

この関数は、呼び出されたとき次の手順を実行する:

  1. NewTarget が undefined またはアクティブな関数オブジェクトのいずれかであれば、TypeError 例外を投げる。
  2. OrdinaryCreateFromConstructor(NewTarget, "%Iterator.prototype%") を返す。

27.1.3.2 Iterator コンストラクターのプロパティ

Iterator コンストラクター:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。
  • 次のプロパティを持つ:

27.1.3.2.1 Iterator.concat ( ...items )

  1. iterables を新しい空の List とする。
  2. items の各要素 item について、次を行う:
    1. item が Object でなければ、TypeError 例外を投げる。
    2. method を ? GetMethod(item, %Symbol.iterator%) とする。
    3. methodundefined ならば、TypeError 例外を投げる。
    4. Record { [[OpenMethod]]: method, [[Iterable]]: item } を iterables に追加する。
  3. closure を、iterables をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. iterables の各 Record iterable について、次を行う:
      1. iter を ? Call(iterable.[[OpenMethod]], iterable.[[Iterable]]) とする。
      2. iter が Object でなければ、TypeError 例外を投げる。
      3. iteratorRecord を ? GetIteratorDirect(iter) とする。
      4. innerAlivetrue とする。
      5. innerAlivetrue である間、繰り返す:
        1. innerValue を ? IteratorStepValue(iteratorRecord) とする。
        2. innerValuedone であれば、
          1. innerAlivefalse に設定する。
        3. そうでなければ、
          1. completionCompletion(Yield(innerValue)) とする。
          2. completionabrupt completion であれば、
            1. IteratorClose(iteratorRecord, completion) を返す。
    2. ReturnCompletion(undefined) を返す。
  4. genCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  5. gen.[[UnderlyingIterators]] を新しい空の List に設定する。
  6. gen を返す。

27.1.3.2.2 Iterator.from ( obj )

  1. iteratorRecord を ? GetIteratorFlattenable(obj, iterate-string-primitives) とする。
  2. hasInstance を ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]]) とする。
  3. hasInstancetrue ならば、
    1. iteratorRecord.[[Iterator]] を返す。
  4. wrapperOrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] ») とする。
  5. wrapper.[[Iterated]]iteratorRecord に設定する。
  6. wrapper を返す。

27.1.3.2.2.1 %WrapForValidIteratorPrototype% オブジェクト

%WrapForValidIteratorPrototype% オブジェクト:

  • 通常のオブジェクトである。
  • 値が %Iterator.prototype% である [[Prototype]] 内部スロットを持つ。

27.1.3.2.2.1.1 %WrapForValidIteratorPrototype%.next ( )

  1. objthis value とする。
  2. RequireInternalSlot(obj, [[Iterated]]) を実行する。
  3. iteratorRecordobj.[[Iterated]] とする。
  4. Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) を返す。

27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. objthis value とする。
  2. RequireInternalSlot(obj, [[Iterated]]) を実行する。
  3. iteratorobj.[[Iterated]].[[Iterator]] とする。
  4. Assert: iterator は Object である。
  5. returnMethod を ? GetMethod(iterator, "return") とする。
  6. returnMethodundefined ならば、
    1. CreateIteratorResultObject(undefined, true) を返す。
  7. Call(returnMethod, iterator) を返す。

27.1.3.2.3 Iterator.prototype

Iterator.prototype の初期値は Iterator プロトタイプオブジェクトである。

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

27.1.3.3 Iterator プロトタイプオブジェクトのプロパティ

Iterator プロトタイプオブジェクト

  • %Iterator.prototype% である。
  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
  • 通常のオブジェクトである。
Note

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

次の式は、ECMAScript コードが %Iterator.prototype% オブジェクトにアクセスできる方法の一つである:

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

27.1.3.3.1 Iterator.prototype.constructor

Iterator.prototype.constructor は、属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つ accessor プロパティである。[[Get]] 属性と [[Set]] 属性は次のように定義される:

27.1.3.3.1.1 get Iterator.prototype.constructor

[[Get]] 属性の値は、引数を必要としない built-in 関数である。呼び出されたとき、次の手順を実行する:

  1. %Iterator% を返す。

27.1.3.3.1.2 set Iterator.prototype.constructor

[[Set]] 属性の値は、引数 v を取る built-in 関数である。呼び出されたとき、次の手順を実行する:

  1. SetterThatIgnoresPrototypeProperties(this value, %Iterator.prototype%, "constructor", v) を実行する。
  2. undefined を返す。
Note

ほとんどの built-in プロトタイプ上の "constructor" プロパティとは異なり、web 互換性の理由により、このプロパティは accessor でなければならない。

27.1.3.3.2 Iterator.prototype.drop ( limit )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. numLimitCompletion(ToNumber(limit)) とする。
  5. IfAbruptCloseIterator(numLimit, iterated)。
  6. numLimitNaN ならば、
    1. errorThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  7. integerLimit を ! ToIntegerOrInfinity(numLimit) とする。
  8. integerLimit < 0 ならば、
    1. errorThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  9. iterated を ? GetIteratorDirect(obj) に設定する。
  10. closure を、iteratedintegerLimit をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. remainingintegerLimit とする。
    2. remaining > 0 である間、繰り返す:
      1. remaining ≠ +∞ ならば、
        1. remainingremaining - 1 に設定する。
      2. next を ? IteratorStep(iterated) とする。
      3. nextdone ならば、ReturnCompletion(undefined) を返す。
    3. 繰り返す:
      1. value を ? IteratorStepValue(iterated) とする。
      2. valuedone ならば、ReturnCompletion(undefined) を返す。
      3. completionCompletion(Yield(value)) とする。
      4. IfAbruptCloseIterator(completion, iterated)。
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  12. result.[[UnderlyingIterators]] を « iterated » に設定する。
  13. result を返す。

27.1.3.3.3 Iterator.prototype.every ( predicate )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を 0 とする。
  7. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、true を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が false ならば、? IteratorClose(iterated, NormalCompletion(false)) を返す。
    6. countercounter + 1 に設定する。

27.1.3.3.4 Iterator.prototype.filter ( predicate )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iteratedpredicate をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す:
      1. value を ? IteratorStepValue(iterated) とする。
      2. valuedone ならば、ReturnCompletion(undefined) を返す。
      3. selectedCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(selected, iterated)。
      5. ToBoolean(selected) が true ならば、
        1. completionCompletion(Yield(value)) とする。
        2. IfAbruptCloseIterator(completion, iterated)。
      6. countercounter + 1 に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

27.1.3.3.5 Iterator.prototype.find ( predicate )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を 0 とする。
  7. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、undefined を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が true ならば、? IteratorClose(iterated, NormalCompletion(value)) を返す。
    6. countercounter + 1 に設定する。

27.1.3.3.6 Iterator.prototype.flatMap ( mapper )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(mapper) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iteratedmapper をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す:
      1. value を ? IteratorStepValue(iterated) とする。
      2. valuedone ならば、ReturnCompletion(undefined) を返す。
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(mapped, iterated)。
      5. innerIteratorCompletion(GetIteratorFlattenable(mapped, reject-primitives)) とする。
      6. IfAbruptCloseIterator(innerIterator, iterated)。
      7. innerAlivetrue とする。
      8. innerAlivetrue である間、繰り返す:
        1. innerValueCompletion(IteratorStepValue(innerIterator)) とする。
        2. IfAbruptCloseIterator(innerValue, iterated)。
        3. innerValuedone であれば、
          1. innerAlivefalse に設定する。
        4. そうでなければ、
          1. completionCompletion(Yield(innerValue)) とする。
          2. completionabrupt completion であれば、
            1. backupCompletionCompletion(IteratorClose(innerIterator, completion)) とする。
            2. IfAbruptCloseIterator(backupCompletion, iterated)。
            3. IteratorClose(iterated, completion) を返す。
      9. countercounter + 1 に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

27.1.3.3.7 Iterator.prototype.forEach ( procedure )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(procedure) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を 0 とする。
  7. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、undefined を返す。
    3. resultCompletion(Call(procedure, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. countercounter + 1 に設定する。

27.1.3.3.8 Iterator.prototype.map ( mapper )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(mapper) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iteratedmapper をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. counter を 0 とする。
    2. 繰り返す:
      1. value を ? IteratorStepValue(iterated) とする。
      2. valuedone ならば、ReturnCompletion(undefined) を返す。
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »)) とする。
      4. IfAbruptCloseIterator(mapped, iterated)。
      5. completionCompletion(Yield(mapped)) とする。
      6. IfAbruptCloseIterator(completion, iterated)。
      7. countercounter + 1 に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

27.1.3.3.9 Iterator.prototype.reduce ( reducer [ , initialValue ] )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(reducer) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. initialValue が存在しないならば、
    1. accumulator を ? IteratorStepValue(iterated) とする。
    2. accumulatordone ならば、TypeError 例外を投げる。
    3. counter を 1 とする。
  7. そうでなければ、
    1. accumulatorinitialValue とする。
    2. counter を 0 とする。
  8. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、accumulator を返す。
    3. resultCompletion(Call(reducer, undefined, « accumulator, value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. accumulatorresult に設定する。
    6. countercounter + 1 に設定する。

27.1.3.3.10 Iterator.prototype.some ( predicate )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false ならば、
    1. errorThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を 0 とする。
  7. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、false を返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が true ならば、? IteratorClose(iterated, NormalCompletion(true)) を返す。
    6. countercounter + 1 に設定する。

27.1.3.3.11 Iterator.prototype.take ( limit )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. numLimitCompletion(ToNumber(limit)) とする。
  5. IfAbruptCloseIterator(numLimit, iterated)。
  6. numLimitNaN ならば、
    1. errorThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  7. integerLimit を ! ToIntegerOrInfinity(numLimit) とする。
  8. integerLimit < 0 ならば、
    1. errorThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  9. iterated を ? GetIteratorDirect(obj) に設定する。
  10. closure を、iteratedintegerLimit をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. remainingintegerLimit とする。
    2. 繰り返す:
      1. remaining = 0 ならば、
        1. IteratorClose(iterated, ReturnCompletion(undefined)) を返す。
      2. remaining ≠ +∞ ならば、
        1. remainingremaining - 1 に設定する。
      3. value を ? IteratorStepValue(iterated) とする。
      4. valuedone ならば、ReturnCompletion(undefined) を返す。
      5. completionCompletion(Yield(value)) とする。
      6. IfAbruptCloseIterator(completion, iterated)。
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  12. result.[[UnderlyingIterators]] を « iterated » に設定する。
  13. result を返す。

27.1.3.3.12 Iterator.prototype.toArray ( )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. objthis value とする。
  2. obj が Object でなければ、TypeError 例外を投げる。
  3. iterated を ? GetIteratorDirect(obj) とする。
  4. items を新しい空の List とする。
  5. 繰り返す:
    1. value を ? IteratorStepValue(iterated) とする。
    2. valuedone ならば、CreateArrayFromList(items) を返す。
    3. valueitems に追加する。

27.1.3.3.13 Iterator.prototype [ %Symbol.iterator% ] ( )

この関数は、呼び出されたとき次の手順を実行する:

  1. this value を返す。

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

27.1.3.3.14 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%] は、属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つ accessor プロパティである。[[Get]] 属性と [[Set]] 属性は次のように定義される:

27.1.3.3.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]

[[Get]] 属性の値は、引数を必要としない built-in 関数である。呼び出されたとき、次の手順を実行する:

  1. "Iterator" を返す。

27.1.3.3.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]

[[Set]] 属性の値は、引数 v を取る built-in 関数である。呼び出されたとき、次の手順を実行する:

  1. SetterThatIgnoresPrototypeProperties(this value, %Iterator.prototype%, %Symbol.toStringTag%, v) を実行する。
  2. undefined を返す。
Note

ほとんどの built-in プロトタイプ上の %Symbol.toStringTag% プロパティとは異なり、web 互換性の理由により、このプロパティは accessor でなければならない。

27.1.4 %AsyncIteratorPrototype% オブジェクト

%AsyncIteratorPrototype% オブジェクト:

  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
  • 通常のオブジェクトである。
Note

この仕様で定義され、async iterator インターフェイスを実装するすべてのオブジェクトも %AsyncIteratorPrototype% から継承する。ECMAScript コードは、%AsyncIteratorPrototype% から継承するオブジェクトを定義することもできる。%AsyncIteratorPrototype% オブジェクトは、すべての async iterator オブジェクトに適用可能な追加メソッドを追加できる場所を提供する。

27.1.4.1 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )

この関数は、呼び出されたとき次の手順を実行する:

  1. this value を返す。

この関数の "name" プロパティの値は "[Symbol.asyncIterator]" である。

27.1.5 Async-from-Sync Iterator オブジェクト

Async-from-Sync Iterator オブジェクトは、特定の同期 iterator に適応する async iterator である。Async-from-Sync Iterator オブジェクトは、ECMAScript コードから直接アクセスできない。Async-from-Sync Iterator オブジェクト用の名前付きコンストラクターは存在しない。代わりに、Async-from-Sync Iterator オブジェクトは必要に応じて CreateAsyncFromSyncIterator 抽象操作によって作成される。

27.1.5.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (Iterator Record) and returns Iterator Record. これは、同期 Iterator Record から async Iterator Record を作成するために使用される。 It performs the following steps when called:

  1. asyncIteratorOrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] ») とする。
  2. asyncIterator.[[SyncIteratorRecord]]syncIteratorRecord に設定する。
  3. nextMethod を ! Get(asyncIterator, "next") とする。
  4. iteratorRecordIterator Record { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false } とする。
  5. iteratorRecord を返す。

27.1.5.2 %AsyncFromSyncIteratorPrototype% オブジェクト

%AsyncFromSyncIteratorPrototype% オブジェクト:

  • すべての Async-from-Sync Iterator オブジェクトによって継承されるプロパティを持つ。
  • 通常のオブジェクトである。
  • 値が %AsyncIteratorPrototype% である [[Prototype]] 内部スロットを持つ。
  • ECMAScript コードから直接アクセスされることは決してない。
  • 次のプロパティを持つ:

27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. objthis value とする。
  2. Assert: obj[[SyncIteratorRecord]] 内部スロットを持つ Object である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]] とする。
  5. value が存在するならば、
    1. resultCompletion(IteratorNext(syncIteratorRecord, value)) とする。
  6. そうでなければ、
    1. resultCompletion(IteratorNext(syncIteratorRecord)) とする。
  7. IfAbruptRejectPromise(result, promiseCapability)。
  8. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) を返す。

27.1.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. objthis value とする。
  2. Assert: obj[[SyncIteratorRecord]] 内部スロットを持つ Object である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]] とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]] とする。
  6. returnCompletion(GetMethod(syncIterator, "return")) とする。
  7. IfAbruptRejectPromise(return, promiseCapability)。
  8. returnundefined ならば、
    1. iteratorResultCreateIteratorResultObject(value, true) とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
    3. promiseCapability.[[Promise]] を返す。
  9. value が存在するならば、
    1. resultCompletion(Call(return, syncIterator, « value »)) とする。
  10. そうでなければ、
    1. resultCompletion(Call(return, syncIterator)) とする。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. result が Object でないならば、
    1. Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, false) を返す。

27.1.5.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

Note
この仕様では、value は常に提供されるが、%AsyncFromSyncIteratorPrototype%.return ( [ value ] ) との一貫性のためにオプションのままにされている。
  1. objthis value とする。
  2. Assert: obj[[SyncIteratorRecord]] 内部スロットを持つ Object である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]] とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]] とする。
  6. throwCompletion(GetMethod(syncIterator, "throw")) とする。
  7. IfAbruptRejectPromise(throw, promiseCapability)。
  8. throwundefined ならば、
    1. NOTE: syncIteratorthrow メソッドを持たない場合、capability を拒否する前にクリーンアップする機会を与えるためにそれを閉じる。
    2. closeCompletionNormalCompletion(empty) とする。
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion)) とする。
    4. IfAbruptRejectPromise(result, promiseCapability)。
    5. NOTE: 次の手順は、プロトコル違反があったこと、すなわち syncIteratorthrow メソッドを持たないことを示すために TypeError を投げる。
    6. NOTE: syncIterator を閉じることが throw しない場合、その操作の結果は、たとえ拒否された promise を生成しても無視される。
    7. Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
    8. promiseCapability.[[Promise]] を返す。
  9. value が存在するならば、
    1. resultCompletion(Call(throw, syncIterator, « value »)) とする。
  10. そうでなければ、
    1. resultCompletion(Call(throw, syncIterator)) とする。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. result が Object でないならば、
    1. Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) を返す。

27.1.5.3 Async-from-Sync Iterator インスタンスのプロパティ

Async-from-Sync Iterator インスタンスは、%AsyncFromSyncIteratorPrototype% intrinsic オブジェクトからプロパティを継承する通常のオブジェクトである。Async-from-Sync Iterator インスタンスは、Table 85 に列挙される内部スロットを持って最初に作成される。

Table 85: Async-from-Sync Iterator インスタンスの内部スロット
内部スロット 説明
[[SyncIteratorRecord]] Iterator Record 適応されている元の同期 iterator を表す。

27.1.5.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

The abstract operation AsyncFromSyncIteratorContinuation takes arguments result (Object), promiseCapability (intrinsic %Promise% 用の PromiseCapability Record), syncIteratorRecord (Iterator Record), and closeOnRejection (Boolean) and returns Promise. It performs the following steps when called:

  1. NOTE: promiseCapability は intrinsic %Promise% から導出されるため、以下の IfAbruptRejectPromise の使用によって伴われる promiseCapability.[[Reject]] への呼び出しは throw しないことが保証される。
  2. doneCompletion(IteratorComplete(result)) とする。
  3. IfAbruptRejectPromise(done, promiseCapability)。
  4. valueCompletion(IteratorValue(result)) とする。
  5. IfAbruptRejectPromise(value, promiseCapability)。
  6. valueWrapperCompletion(PromiseResolve(%Promise%, value)) とする。
  7. valueWrapperabrupt completion であり、donefalse であり、かつ closeOnRejectiontrue であるならば、
    1. valueWrapperCompletion(IteratorClose(syncIteratorRecord, valueWrapper)) に設定する。
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability)。
  9. unwrap を、done をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (v) を持つ新しい Abstract Closure とする:
    1. CreateIteratorResultObject(v, done) を返す。
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « ») とする。
  11. NOTE: onFulfilled は、IteratorResult オブジェクトの "value" プロパティを処理する際、その値が promise である場合にその値を待機し、その結果を新しい「unwrapped」IteratorResult オブジェクトに再パッケージ化するために使用される。
  12. donetrue または closeOnRejectionfalse ならば、
    1. onRejectedundefined とする。
  13. そうでなければ、
    1. closeIterator を、syncIteratorRecord をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (error) を持つ新しい Abstract Closure とする:
      1. IteratorClose(syncIteratorRecord, ThrowCompletion(error)) を返す。
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « ») とする。
    3. NOTE: onRejected は、IteratorResult オブジェクトが生成するその "value" プロパティが拒否された promise である場合に Iterator を閉じるために使用される。
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability) を実行する。
  15. promiseCapability.[[Promise]] を返す。

27.2 Promise オブジェクト

Promise は、遅延された(かつ非同期である可能性のある)計算の最終的な結果のプレースホルダーとして使用されるオブジェクトである。

任意の Promise は、相互に排他的な 3 つの状態、すなわち fulfilledrejected、および pending のいずれかにある:

  • promise p は、p.then(f, r) が関数 f を呼び出す Job をただちにエンキューするならば fulfilled である。
  • promise p は、p.then(f, r) が関数 r を呼び出す Job をただちにエンキューするならば rejected である。
  • promise は、fulfilled でも rejected でもないならば pending である。

promise は、pending でない場合、すなわち fulfilled または rejected のいずれかである場合、settled であると言われる。

promise は、settled であるか、または別の promise の状態に一致するように「locked in」されている場合、resolved である。resolved promise を resolve または reject しようとしても効果はない。promise は、resolved でなければ unresolved である。unresolved promise は常に pending 状態にある。resolved promise は pending、fulfilled、または rejected であり得る。

27.2.1 Promise 抽象操作

27.2.1.1 PromiseCapability Record

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

PromiseCapability Record は、Table 86 に列挙されるフィールドを持つ。

Table 86: PromiseCapability Record のフィールド
フィールド名 意味
[[Promise]] Object promise として使用できるオブジェクト。
[[Resolve]] function object 与えられた promise を resolve するために使用される関数。
[[Reject]] function object 与えられた promise を reject するために使用される関数。

27.2.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise は、PromiseCapability Record を使用する一連のアルゴリズム手順の省略表記である。次の形式のアルゴリズム手順:

  1. IfAbruptRejectPromise(value, capability).

は、次と同じ意味である:

  1. Assert: valueCompletion Record である。
  2. valueabrupt completion であるならば、
    1. Call(capability.[[Reject]], undefined, « value.[[Value]] ») を実行する。
    2. capability.[[Promise]] を返す。
  3. value を ! value に設定する。

27.2.1.2 PromiseReaction Record

PromiseReaction Record は、promise が与えられた値で resolved または rejected になったときにどのように反応すべきかに関する情報を格納するために使用される Record 値である。PromiseReaction Record は PerformPromiseThen 抽象操作によって作成され、NewPromiseReactionJob によって返される Abstract Closure によって使用される。

PromiseReaction Record は、Table 87 に列挙されるフィールドを持つ。

Table 87: PromiseReaction Record のフィールド
フィールド名 意味
[[Capability]] PromiseCapability Record または undefined このレコードが reaction handler を提供する promise の capability。
[[Type]] fulfill または reject [[Type]] は、[[Handler]]empty である場合に、settlement の種類に固有の動作を可能にするために使用される。
[[Handler]] JobCallback Record または empty 入力値に適用されるべき関数であり、その戻り値が派生 promise に何が起こるかを支配する。[[Handler]]empty である場合、代わりに [[Type]] の値に依存する関数が使用される。

27.2.1.3 CreateResolvingFunctions ( toResolve )

The abstract operation CreateResolvingFunctions takes argument toResolve (Promise) and returns フィールド [[Resolve]] (function object) および [[Reject]] (function object) を持つ Record. It performs the following steps when called:

  1. promiseOrEmptyRecord { [[Value]]: toResolve } とする。
  2. resolveSteps を、promiseOrEmpty をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (resolution) を持つ新しい Abstract Closure とする:
    1. promiseOrEmpty.[[Value]]empty であれば、undefined を返す。
    2. promisepromiseOrEmpty.[[Value]] とする。
    3. promiseOrEmpty.[[Value]]empty に設定する。
    4. SameValue(resolution, promise) が true であれば、
      1. selfResolutionError を新しく作成された TypeError オブジェクトとする。
      2. RejectPromise(promise, selfResolutionError) を実行する。
      3. undefined を返す。
    5. resolution が Object でないならば、
      1. FulfillPromise(promise, resolution) を実行する。
      2. undefined を返す。
    6. thenCompletion(Get(resolution, "then")) とする。
    7. thenabrupt completion であるならば、
      1. RejectPromise(promise, then.[[Value]]) を実行する。
      2. undefined を返す。
    8. thenActionthen.[[Value]] とする。
    9. IsCallable(thenAction) が false であれば、
      1. FulfillPromise(promise, resolution) を実行する。
      2. undefined を返す。
    10. thenJobCallbackHostMakeJobCallback(thenAction) とする。
    11. jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback) とする。
    12. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する。
    13. undefined を返す。
  3. resolveCreateBuiltinFunction(resolveSteps, 1, "", « ») とする。
  4. rejectSteps を、promiseOrEmpty をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (reason) を持つ新しい Abstract Closure とする:
    1. promiseOrEmpty.[[Value]]empty であれば、undefined を返す。
    2. promisepromiseOrEmpty.[[Value]] とする。
    3. promiseOrEmpty.[[Value]]empty に設定する。
    4. RejectPromise(promise, reason) を実行する。
    5. undefined を返す。
  5. rejectCreateBuiltinFunction(rejectSteps, 1, "", « ») とする。
  6. Record { [[Resolve]]: resolve, [[Reject]]: reject } を返す。

27.2.1.4 FulfillPromise ( promise, value )

The abstract operation FulfillPromise takes arguments promise (Promise) and value (ECMAScript 言語値) and returns unused. It performs the following steps when called:

  1. Assert: promise.[[PromiseState]]pending である。
  2. reactionspromise.[[PromiseFulfillReactions]] とする。
  3. promise.[[PromiseResult]]value に設定する。
  4. promise.[[PromiseFulfillReactions]]undefined に設定する。
  5. promise.[[PromiseRejectReactions]]undefined に設定する。
  6. promise.[[PromiseState]]fulfilled に設定する。
  7. TriggerPromiseReactions(reactions, value) を実行する。
  8. unused を返す。

27.2.1.5 NewPromiseCapability ( constructor )

The abstract operation NewPromiseCapability takes argument constructor (ECMAScript 言語値) and returns PromiseCapability Record を含む normal completion または throw completion のいずれか. これは、built-in Promise コンストラクターの方式で constructor をコンストラクターとして使用し、promise を作成してその resolve 関数と reject 関数を抽出しようとする。promise と resolve 関数および reject 関数は、新しい PromiseCapability Record を初期化するために使用される。 It performs the following steps when called:

  1. IsConstructor(constructor) が false であれば、TypeError 例外を投げる。
  2. NOTE: constructor は、Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であると想定される(27.2.3.1 を参照)。
  3. resolvingFunctionsRecord { [[Resolve]]: undefined, [[Reject]]: undefined } とする。
  4. executorClosure を、resolvingFunctions をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (resolve, reject) を持つ新しい Abstract Closure とする:
    1. resolvingFunctions.[[Resolve]]undefined でないならば、TypeError 例外を投げる。
    2. resolvingFunctions.[[Reject]]undefined でないならば、TypeError 例外を投げる。
    3. resolvingFunctions.[[Resolve]]resolve に設定する。
    4. resolvingFunctions.[[Reject]]reject に設定する。
    5. NormalCompletion(undefined) を返す。
  5. executorCreateBuiltinFunction(executorClosure, 2, "", « ») とする。
  6. promise を ? Construct(constructor, « executor ») とする。
  7. IsCallable(resolvingFunctions.[[Resolve]]) が false であれば、TypeError 例外を投げる。
  8. IsCallable(resolvingFunctions.[[Reject]]) が false であれば、TypeError 例外を投げる。
  9. PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFunctions.[[Resolve]], [[Reject]]: resolvingFunctions.[[Reject]] } を返す。
Note

この抽象操作は Promise のサブクラス化をサポートする。これは、渡された executor 関数引数を Promise コンストラクターと同じ方法で呼び出す任意のコンストラクターに対して generic であるためである。Promise コンストラクターの static メソッドを任意のサブクラスへ一般化するために使用される。

27.2.1.6 IsPromise ( value )

The abstract operation IsPromise takes argument value (ECMAScript 言語値) and returns Boolean. これは、オブジェクト上の promise brand を検査する。 It performs the following steps when called:

  1. value が Object でなければ、false を返す。
  2. value[[PromiseState]] 内部スロットを持たなければ、false を返す。
  3. true を返す。

27.2.1.7 RejectPromise ( promise, reason )

The abstract operation RejectPromise takes arguments promise (Promise) and reason (ECMAScript 言語値) and returns unused. It performs the following steps when called:

  1. Assert: promise.[[PromiseState]]pending である。
  2. reactionspromise.[[PromiseRejectReactions]] とする。
  3. promise.[[PromiseResult]]reason に設定する。
  4. promise.[[PromiseFulfillReactions]]undefined に設定する。
  5. promise.[[PromiseRejectReactions]]undefined に設定する。
  6. promise.[[PromiseState]]rejected に設定する。
  7. promise.[[PromiseIsHandled]]false ならば、HostPromiseRejectionTracker(promise, "reject") を実行する。
  8. TriggerPromiseReactions(reactions, reason) を実行する。
  9. unused を返す。

27.2.1.8 TriggerPromiseReactions ( reactions, argument )

The abstract operation TriggerPromiseReactions takes arguments reactions (PromiseReaction RecordList) and argument (ECMAScript 言語値) and returns unused. これは、reactions 内の各レコードについて新しい Job をエンキューする。そのような各 Job は、PromiseReaction Record[[Type]][[Handler]] を処理し、[[Handler]]empty でなければ、与えられた引数を渡してそれを呼び出す。[[Handler]]empty である場合、動作は [[Type]] によって決定される。 It performs the following steps when called:

  1. reactions の各要素 reaction について、次を行う:
    1. jobNewPromiseReactionJob(reaction, argument) とする。
    2. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する。
  2. unused を返す。

27.2.1.9 HostPromiseRejectionTracker ( promise, operation )

The host-defined abstract operation HostPromiseRejectionTracker takes arguments promise (Promise) and operation ("reject" または "handle") and returns unused. これは、host environment が promise rejection を追跡できるようにする。

HostPromiseRejectionTracker の既定の実装は、unused を返すことである。

Note 1

HostPromiseRejectionTracker は 2 つのシナリオで呼び出される:

  • promise が handler なしで rejected になったとき、operation 引数を "reject" に設定して呼び出される。
  • rejected promise に初めて handler が追加されたとき、operation 引数を "handle" に設定して呼び出される。

HostPromiseRejectionTracker の典型的な実装は、unhandled rejection について開発者に通知しようとしつつ、以前のそのような通知が後から新しい handler の付加によって無効化された場合にも注意深く通知するかもしれない。

Note 2

operation"handle" である場合、実装は garbage collection を妨げるような方法で promise への参照を保持するべきではない。operation"reject" である場合、rejection はまれであり hot code path 上にはないと期待されるため、実装は promise への参照を保持してもよい。

27.2.2 Promise Job

27.2.2.1 NewPromiseReactionJob ( reaction, argument )

The abstract operation NewPromiseReactionJob takes arguments reaction (PromiseReaction Record) and argument (ECMAScript 言語値) and returns フィールド [[Job]] (Job Abstract Closure) および [[Realm]] (Realm Record または null) を持つ Record. これは、入力値に適切な handler を適用し、その handler の戻り値を使用して、その handler に関連付けられた派生 promise を resolve または reject する新しい Job Abstract Closure を返す。 It performs the following steps when called:

  1. job を、reactionargument をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Job Abstract Closure とする:
    1. promiseCapabilityreaction.[[Capability]] とする。
    2. typereaction.[[Type]] とする。
    3. handlerreaction.[[Handler]] とする。
    4. handlerempty であれば、
      1. typefulfill であれば、
        1. handlerResultNormalCompletion(argument) とする。
      2. そうでなければ、
        1. Assert: typereject である。
        2. handlerResultThrowCompletion(argument) とする。
    5. そうでなければ、
      1. handlerResultCompletion(HostCallJobCallback(handler, undefined, « argument »)) とする。
    6. promiseCapabilityundefined であれば、
      1. Assert: handlerResultabrupt completion でない。
      2. empty を返す。
    7. Assert: promiseCapabilityPromiseCapability Record である。
    8. handlerResultabrupt completion であるならば、
      1. Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] ») を返す。
    9. Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] ») を返す。
  2. handlerRealmnull とする。
  3. reaction.[[Handler]]empty でないならば、
    1. getHandlerRealmResultCompletion(GetFunctionRealm(reaction.[[Handler]].[[Callback]])) とする。
    2. getHandlerRealmResultnormal completion であるならば、handlerRealmgetHandlerRealmResult.[[Value]] に設定する。
    3. そうでなければ、handlerRealm を現在の Realm Record に設定する。
    4. NOTE: handler が undefined でない限り、handlerRealmnull になることはない。handler が revoked Proxy であり、ECMAScript コードが実行されない場合、handlerRealm はエラーオブジェクトを作成するために使用される。
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm } を返す。

27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

The abstract operation NewPromiseResolveThenableJob takes arguments promiseToResolve (Promise), thenable (Object), and then (JobCallback Record) and returns フィールド [[Job]] (Job Abstract Closure) および [[Realm]] (Realm Record) を持つ Record. It performs the following steps when called:

  1. job を、promiseToResolvethenable、および then をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Job Abstract Closure とする:
    1. resolvingFunctionsCreateResolvingFunctions(promiseToResolve) とする。
    2. thenCallResultCompletion(HostCallJobCallback(then, thenable, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)) とする。
    3. thenCallResultabrupt completion であるならば、
      1. Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] ») を返す。
    4. thenCallResult を返す。
  2. getThenRealmResultCompletion(GetFunctionRealm(then.[[Callback]])) とする。
  3. getThenRealmResultnormal completion であるならば、thenRealmgetThenRealmResult.[[Value]] とする。
  4. そうでなければ、thenRealm を現在の Realm Record とする。
  5. NOTE: thenRealmnull になることはない。then.[[Callback]] が revoked Proxy でありコードが実行されない場合、thenRealm はエラーオブジェクトを作成するために使用される。
  6. Record { [[Job]]: job, [[Realm]]: thenRealm } を返す。
Note

この Job は、与えられた promise を resolve するために、提供された thenable とその then メソッドを使用する。この処理は、周囲のコードの評価が完了した後に then メソッドの評価が行われることを保証するために、Job として行われなければならない。

27.2.3 Promise コンストラクター

Promise コンストラクター:

  • %Promise% である。
  • グローバルオブジェクト"Promise" プロパティの初期値である。
  • コンストラクターとして呼び出されたとき、新しい Promise を作成し初期化する。
  • 関数として呼び出されることは意図されておらず、そのように呼び出された場合は例外を投げる。
  • クラス定義の extends 節における値として使用してよい。指定された Promise の動作を継承することを意図するサブクラスコンストラクターは、Promise および Promise.prototype の built-in メソッドをサポートするために必要な内部状態を持つサブクラスインスタンスを作成し初期化するため、Promise コンストラクターへの super 呼び出しを含まなければならない。

27.2.3.1 Promise ( executor )

この関数は、呼び出されたとき次の手順を実行する:

  1. NewTarget が undefined であれば、TypeError 例外を投げる。
  2. IsCallable(executor) が false であれば、TypeError 例外を投げる。
  3. promise を ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») とする。
  4. promise.[[PromiseState]]pending に設定する。
  5. promise.[[PromiseResult]]empty に設定する。
  6. promise.[[PromiseFulfillReactions]] を新しい空の List に設定する。
  7. promise.[[PromiseRejectReactions]] を新しい空の List に設定する。
  8. promise.[[PromiseIsHandled]]false に設定する。
  9. resolvingFunctionsCreateResolvingFunctions(promise) とする。
  10. completionCompletion(Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)) とする。
  11. completionabrupt completion であるならば、
    1. Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] ») を実行する。
  12. promise を返す。
Note

executor 引数は function object でなければならない。これは、この Promise によって表される、遅延される可能性のある動作を開始し、その完了を報告するために呼び出される。executor は 2 つの引数、resolvereject で呼び出される。これらは、遅延計算の最終的な完了または失敗を報告するために executor 関数が使用できる関数である。executor 関数から戻ることは、遅延動作が完了したことを意味するのではなく、最終的に遅延動作を実行する要求が受け入れられたことのみを意味する。

executor 関数に渡される resolve 関数は単一の引数を受け入れる。executor コードは、関連付けられた Promise を resolve したいことを示すために、最終的に resolve 関数を呼び出してよい。resolve 関数に渡される引数は、遅延動作の最終的な値を表し、実際の fulfillment 値、または fulfilled された場合にその値を提供する別の promise のいずれかであり得る。

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

Promise コンストラクターによって executor 関数に渡される resolve 関数と reject 関数は、関連付けられた promise を実際に resolve および reject する能力を持つ。サブクラスは、resolve と reject に対してカスタマイズされた値を渡す異なるコンストラクター動作を持ち得る。

27.2.4 Promise コンストラクターのプロパティ

Promise コンストラクター:

  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。
  • 次のプロパティを持つ:

27.2.4.1 Promise.all ( iterable )

この関数は、渡された promise の fulfillment 値の配列で fulfilled される新しい promise、または rejected になる最初の渡された promise の理由で rejected される新しい promise を返す。このアルゴリズムを実行する際、渡された iterable のすべての要素を promise に resolve する。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. promiseResolveCompletion(GetPromiseResolve(constructor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAll(iteratorRecord, constructor, promiseCapability, promiseResolve)) とする。
  8. resultabrupt completion であるならば、
    1. iteratorRecord.[[Done]]false であれば、resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを要求する。

27.2.4.1.1 GetPromiseResolve ( promiseConstructor )

The abstract operation GetPromiseResolve takes argument promiseConstructor (constructor) and returns function object を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. promiseResolve を ? Get(promiseConstructor, "resolve") とする。
  2. IsCallable(promiseResolve) が false であれば、TypeError 例外を投げる。
  3. promiseResolve を返す。

27.2.4.1.2 PerformPromiseAll ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAll takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. values を新しい空の List とする。
  2. NOTE: remainingElementsCount は、入力 iterator が尽きる前に渡された callback を呼び出す不正な "then" が存在しても、resultCapability.[[Resolve]] が一度だけ呼び出されることを保証するため、0 ではなく 1 から開始する。
  3. remainingElementsCountRecord { [[Value]]: 1 } とする。
  4. index を 0 とする。
  5. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone であれば、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefinedvalues に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. fulfilledSteps を、valuesresultCapability、および remainingElementsCount をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (value) を持つ新しい Abstract Closure とする:
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]]true であれば、undefined を返す。
      3. activeFunc.[[AlreadyCalled]]true に設定する。
      4. thisIndexactiveFunc.[[Index]] とする。
      5. values[thisIndex] を value に設定する。
      6. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      7. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を返す。
      8. undefined を返す。
    6. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    7. onFulfilled.[[AlreadyCalled]]false に設定する。
    8. onFulfilled.[[Index]]index に設定する。
    9. indexindex + 1 に設定する。
    10. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    11. Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] ») を実行する。

27.2.4.2 Promise.allSettled ( iterable )

この関数は、元のすべての promise が settled、すなわち fulfilled または rejected のいずれかになった後にのみ、promise 状態の snapshot の配列で fulfilled される promise を返す。このアルゴリズムを実行する際、渡された iterable のすべての要素を promise に resolve する。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. promiseResolveCompletion(GetPromiseResolve(constructor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAllSettled(iteratorRecord, constructor, promiseCapability, promiseResolve)) とする。
  8. resultabrupt completion であるならば、
    1. iteratorRecord.[[Done]]false であれば、resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを要求する。

27.2.4.2.1 PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAllSettled takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. values を新しい空の List とする。
  2. NOTE: remainingElementsCount は、入力 iterator が尽きる前に渡された callback の一つを呼び出す不正な "then" が存在しても、resultCapability.[[Resolve]] が一度だけ呼び出されることを保証するため、0 ではなく 1 から開始する。
  3. remainingElementsCountRecord { [[Value]]: 1 } とする。
  4. index を 0 とする。
  5. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone であれば、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefinedvalues に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. alreadyCalledRecord { [[Value]]: false } とする。
    6. fulfilledSteps を、valuesresultCapability、および remainingElementsCount をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (value) を持つ新しい Abstract Closure とする:
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]].[[Value]]true であれば、undefined を返す。
      3. activeFunc.[[AlreadyCalled]].[[Value]]true に設定する。
      4. objOrdinaryObjectCreate(%Object.prototype%) とする。
      5. CreateDataPropertyOrThrow(obj, "status", "fulfilled") を実行する。
      6. CreateDataPropertyOrThrow(obj, "value", value) を実行する。
      7. thisIndexactiveFunc.[[Index]] とする。
      8. values[thisIndex] を obj に設定する。
      9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      10. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を返す。
      11. undefined を返す。
    7. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    8. onFulfilled.[[AlreadyCalled]]alreadyCalled に設定する。
    9. onFulfilled.[[Index]]index に設定する。
    10. rejectedSteps を、valuesresultCapability、および remainingElementsCount をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (error) を持つ新しい Abstract Closure とする:
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]].[[Value]]true であれば、undefined を返す。
      3. activeFunc.[[AlreadyCalled]].[[Value]]true に設定する。
      4. objOrdinaryObjectCreate(%Object.prototype%) とする。
      5. CreateDataPropertyOrThrow(obj, "status", "rejected") を実行する。
      6. CreateDataPropertyOrThrow(obj, "reason", error) を実行する。
      7. thisIndexactiveFunc.[[Index]] とする。
      8. values[thisIndex] を obj に設定する。
      9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      10. remainingElementsCount.[[Value]] = 0 であれば、
        1. valuesArrayCreateArrayFromList(values) とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を返す。
      11. undefined を返す。
    11. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    12. onRejected.[[AlreadyCalled]]alreadyCalled に設定する。
    13. onRejected.[[Index]]index に設定する。
    14. indexindex + 1 に設定する。
    15. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    16. Invoke(nextPromise, "then", « onFulfilled, onRejected ») を実行する。

27.2.4.3 Promise.any ( iterable )

この関数は、与えられた promise のうち最初に fulfilled されたものによって fulfilled される promise、または与えられた promise のすべてが rejected された場合に rejection 理由を保持する AggregateError で rejected される promise を返す。このアルゴリズムを実行する際、渡された iterable のすべての要素を promise に resolve する。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. promiseResolveCompletion(GetPromiseResolve(constructor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAny(iteratorRecord, constructor, promiseCapability, promiseResolve)) とする。
  8. resultabrupt completion であるならば、
    1. iteratorRecord.[[Done]]false であれば、resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを要求する。

27.2.4.3.1 PerformPromiseAny ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseAny takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. errors を新しい空の List とする。
  2. NOTE: remainingElementsCount は、入力 iterator が尽きる前に渡された callback を呼び出す不正な "then" が存在しても、resultCapability.[[Reject]] が一度だけ呼び出されることを保証するため、0 ではなく 1 から開始する。
  3. remainingElementsCountRecord { [[Value]]: 1 } とする。
  4. index を 0 とする。
  5. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone であれば、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. remainingElementsCount.[[Value]] = 0 であれば、
        1. aggregateError を新しく作成された AggregateError オブジェクトとする。
        2. DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) を実行する。
        3. Call(resultCapability.[[Reject]], undefined, « aggregateError ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefinederrors に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. rejectedSteps を、errorsresultCapability、および remainingElementsCount をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (error) を持つ新しい Abstract Closure とする:
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]]true であれば、undefined を返す。
      3. activeFunc.[[AlreadyCalled]]true に設定する。
      4. thisIndexactiveFunc.[[Index]] とする。
      5. errors[thisIndex] を error に設定する。
      6. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      7. remainingElementsCount.[[Value]] = 0 であれば、
        1. aggregateError を新しく作成された AggregateError オブジェクトとする。
        2. DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) を実行する。
        3. Call(resultCapability.[[Reject]], undefined, « aggregateError ») を返す。
      8. undefined を返す。
    6. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    7. onRejected.[[AlreadyCalled]]false に設定する。
    8. onRejected.[[Index]]index に設定する。
    9. indexindex + 1 に設定する。
    10. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    11. Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected ») を実行する。

27.2.4.4 Promise.prototype

Promise.prototype の初期値は Promise プロトタイプオブジェクトである。

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

27.2.4.5 Promise.race ( iterable )

この関数は、渡された promise のうち最初に settle する promise と同じ方法で settled される新しい promise を返す。このアルゴリズムを実行する際、渡された iterable のすべての要素を promise に resolve する。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. promiseResolveCompletion(GetPromiseResolve(constructor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseRace(iteratorRecord, constructor, promiseCapability, promiseResolve)) とする。
  8. resultabrupt completion であるならば、
    1. iteratorRecord.[[Done]]false であれば、resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note 1

iterable 引数が値を生成しない場合、または iterable によって生成された promise のいずれも決して settle しない場合、このメソッドによって返される pending promise は決して settled にならない。

Note 2

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを期待する。また、その this value が resolve メソッドを提供することも期待する。

27.2.4.5.1 PerformPromiseRace ( iteratorRecord, constructor, resultCapability, promiseResolve )

The abstract operation PerformPromiseRace takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an Object or a throw completion. It performs the following steps when called:

  1. 繰り返す:
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. nextdone であれば、
      1. resultCapability.[[Promise]] を返す。
    3. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    4. Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») を実行する。

27.2.4.6 Promise.reject ( reason )

この関数は、渡された引数で rejected された新しい promise を返す。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. Call(promiseCapability.[[Reject]], undefined, « reason ») を実行する。
  4. promiseCapability.[[Promise]] を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを期待する。

27.2.4.7 Promise.resolve ( resolution )

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

  1. constructorthis value とする。
  2. constructor が Object でなければ、TypeError 例外を投げる。
  3. PromiseResolve(constructor, resolution) を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを期待する。

27.2.4.7.1 PromiseResolve ( constructor, resolution )

The abstract operation PromiseResolve takes arguments constructor (an Object) and resolution (an ECMAScript language value) and returns either a normal completion containing an Object or a throw completion. これは、resolution で resolved された新しい promise を返す。 It performs the following steps when called:

  1. IsPromise(resolution) が true であれば、
    1. xConstructor を ? Get(resolution, "constructor") とする。
    2. SameValue(xConstructor, constructor) が true であれば、resolution を返す。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. Call(promiseCapability.[[Resolve]], undefined, « resolution ») を実行する。
  4. promiseCapability.[[Promise]] を返す。

27.2.4.8 Promise.try ( callback, ...args )

この関数は、呼び出されたとき次の手順を実行する:

  1. constructorthis value とする。
  2. constructor が Object でなければ、TypeError 例外を投げる。
  3. promiseCapability を ? NewPromiseCapability(constructor) とする。
  4. statusCompletion(Call(callback, undefined, args)) とする。
  5. statusabrupt completion であるならば、
    1. Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] ») を実行する。
  6. そうでなければ、
    1. Call(promiseCapability.[[Resolve]], undefined, « status.[[Value]] ») を実行する。
  7. promiseCapability.[[Promise]] を返す。
Note

この関数は、その this value が Promise コンストラクターのパラメータ規約をサポートするコンストラクター関数であることを期待する。

27.2.4.9 Promise.withResolvers ( )

この関数は、新しい promise と、それに関連付けられた resolve 関数および reject 関数を合わせた 3 つのプロパティを持つオブジェクトを返す。

  1. constructorthis value とする。
  2. promiseCapability を ? NewPromiseCapability(constructor) とする。
  3. objOrdinaryObjectCreate(%Object.prototype%) とする。
  4. CreateDataPropertyOrThrow(obj, "promise", promiseCapability.[[Promise]]) を実行する。
  5. CreateDataPropertyOrThrow(obj, "resolve", promiseCapability.[[Resolve]]) を実行する。
  6. CreateDataPropertyOrThrow(obj, "reject", promiseCapability.[[Reject]]) を実行する。
  7. obj を返す。

27.2.4.10 get Promise [ %Symbol.species% ]

Promise[%Symbol.species%] は set accessor 関数が undefined である accessor プロパティである。その get accessor 関数は、呼び出されたとき次の手順を実行する:

  1. this value を返す。

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

Note

Promise プロトタイプメソッドは通常、派生オブジェクトを作成するために、その this value のコンストラクターを使用する。しかし、サブクラスコンストラクターは、その %Symbol.species% プロパティを再定義することによって、その既定の動作を上書きしてよい。

27.2.5 Promise プロトタイプオブジェクトのプロパティ

Promise プロトタイプオブジェクト

  • %Promise.prototype% である。
  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持つ。
  • 通常のオブジェクトである。
  • [[PromiseState]] 内部スロット、または Promise インスタンスのその他の内部スロットを持たない。

27.2.5.1 Promise.prototype.catch ( onRejected )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. promisethis value とする。
  2. Invoke(promise, "then", « undefined, onRejected ») を返す。

27.2.5.2 Promise.prototype.constructor

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

27.2.5.3 Promise.prototype.finally ( onFinally )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. promisethis value とする。
  2. promise が Object でなければ、TypeError 例外を投げる。
  3. constructor を ? SpeciesConstructor(promise, %Promise%) とする。
  4. Assert: IsConstructor(constructor) は true である。
  5. IsCallable(onFinally) が false であれば、
    1. thenFinallyonFinally とする。
    2. catchFinallyonFinally とする。
  6. そうでなければ、
    1. thenFinallyClosure を、onFinallyconstructor をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (value) を持つ新しい Abstract Closure とする:
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(constructor, result) とする。
      3. returnValue を、value をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
        1. NormalCompletion(value) を返す。
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « ») とする。
      5. Invoke(p, "then", « valueThunk ») を返す。
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « ») とする。
    3. catchFinallyClosure を、onFinallyconstructor をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (reason) を持つ新しい Abstract Closure とする:
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(constructor, result) とする。
      3. throwReason を、reason をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
        1. reason を投げる。
      4. throwerCreateBuiltinFunction(throwReason, 0, "", « ») とする。
      5. Invoke(p, "then", « thrower ») を返す。
    4. catchFinallyCreateBuiltinFunction(catchFinallyClosure, 1, "", « ») とする。
  7. Invoke(promise, "then", « thenFinally, catchFinally ») を返す。

27.2.5.4 Promise.prototype.then ( onFulfilled, onRejected )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. promisethis value とする。
  2. IsPromise(promise) が false であれば、TypeError 例外を投げる。
  3. constructor を ? SpeciesConstructor(promise, %Promise%) とする。
  4. resultCapability を ? NewPromiseCapability(constructor) とする。
  5. PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability) を返す。

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

The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record) and returns an Object or undefined. これは、onFulfilledonRejected を settlement action として使用して、promise に対して “then” 操作を実行する。resultCapability が渡された場合、結果は resultCapability の promise を更新することによって格納される。渡されなかった場合、PerformPromiseThen は、結果が重要でない仕様内部操作によって呼び出されている。 It performs the following steps when called:

  1. Assert: IsPromise(promise) は true である。
  2. resultCapability が存在しないならば、
    1. resultCapabilityundefined に設定する。
  3. IsCallable(onFulfilled) が false であれば、
    1. onFulfilledJobCallbackempty とする。
  4. そうでなければ、
    1. onFulfilledJobCallbackHostMakeJobCallback(onFulfilled) とする。
  5. IsCallable(onRejected) が false であれば、
    1. onRejectedJobCallbackempty とする。
  6. そうでなければ、
    1. onRejectedJobCallbackHostMakeJobCallback(onRejected) とする。
  7. fulfillReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: fulfill, [[Handler]]: onFulfilledJobCallback } とする。
  8. rejectReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: reject, [[Handler]]: onRejectedJobCallback } とする。
  9. promise.[[PromiseState]]pending であるならば、
    1. fulfillReactionpromise.[[PromiseFulfillReactions]] に追加する。
    2. rejectReactionpromise.[[PromiseRejectReactions]] に追加する。
  10. そうではなく promise.[[PromiseState]]fulfilled であるならば、
    1. valuepromise.[[PromiseResult]] とする。
    2. fulfillJobNewPromiseReactionJob(fulfillReaction, value) とする。
    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]) を実行する。
  11. そうでなければ、
    1. Assert: promise.[[PromiseState]]rejected である。
    2. reasonpromise.[[PromiseResult]] とする。
    3. promise.[[PromiseIsHandled]]false であれば、HostPromiseRejectionTracker(promise, "handle") を実行する。
    4. rejectJobNewPromiseReactionJob(rejectReaction, reason) とする。
    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]]) を実行する。
  12. promise.[[PromiseIsHandled]]true に設定する。
  13. resultCapabilityundefined であれば、undefined を返す。
  14. resultCapability.[[Promise]] を返す。

27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "Promise" である。

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

27.2.6 Promise インスタンスのプロパティ

Promise インスタンスは、Promise プロトタイプオブジェクト(intrinsic, %Promise.prototype%)からプロパティを継承する通常のオブジェクトである。Promise インスタンスは、Table 88 に記述される内部スロットを持って最初に作成される。

Table 88: Promise インスタンスの内部スロット
内部スロット 説明
[[PromiseState]] pending, fulfilled, または rejected promise がその then メソッドへの入力呼び出しにどのように反応するかを支配する。
[[PromiseResult]] ECMAScript 言語値または empty promise が fulfilled または rejected された値(存在する場合)。[[PromiseState]]pending である場合に、かつその場合に限り empty である。
[[PromiseFulfillReactions]] PromiseReaction RecordList promise が pending 状態から fulfilled 状態に遷移するとき/遷移する場合に処理される Record
[[PromiseRejectReactions]] PromiseReaction RecordList promise が pending 状態から rejected 状態に遷移するとき/遷移する場合に処理される Record
[[PromiseIsHandled]] Boolean promise が fulfillment または rejection handler をこれまでに持ったことがあるかどうかを示す。unhandled rejection tracking で使用される。

27.3 GeneratorFunction オブジェクト

GeneratorFunction は、通常 GeneratorDeclarationGeneratorExpression、および GeneratorMethod を評価することによって作成される関数である。%GeneratorFunction% intrinsic を呼び出すことによって作成されることもある。

Figure 6 (Informative): Generator オブジェクトの関係
驚くほど多様なボックスと矢印。

27.3.1 GeneratorFunction コンストラクター

GeneratorFunction コンストラクター:

  • %GeneratorFunction% である。
  • Function のサブクラスである。
  • コンストラクターとしてではなく関数として呼び出されたとき、新しい GeneratorFunction を作成し初期化する。したがって、関数呼び出し GeneratorFunction (…) は、同じ引数を持つオブジェクト作成式 new GeneratorFunction (…) と等価である。
  • クラス定義の extends 節の値として使用してよい。指定された GeneratorFunction の動作を継承することを意図するサブクラスコンストラクターは、built-in GeneratorFunction の動作に必要な内部スロットを持つサブクラスインスタンスを作成し初期化するため、GeneratorFunction コンストラクターへの super 呼び出しを含まなければならない。generator function オブジェクトを定義するすべての ECMAScript 構文形式は、GeneratorFunction の直接インスタンスを作成する。GeneratorFunction サブクラスのインスタンスを作成する構文上の手段は存在しない。

27.3.1.1 GeneratorFunction ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)は generator function の本体(実行可能コード)を指定し、それより前の任意の引数は仮引数を指定する。

この関数は、呼び出されたとき次の手順を実行する:

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. bodyArg が存在しないならば、bodyArg を空の String に設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, generator, parameterArgs, bodyArg) を返す。
Note

20.2.1.1NOTE を参照。

27.3.2 GeneratorFunction コンストラクターのプロパティ

GeneratorFunction コンストラクター:

  • Function コンストラクターから継承する標準 built-in 関数オブジェクトである。
  • 値が %Function% である [[Prototype]] 内部スロットを持つ。
  • 値が 1𝔽 である "length" プロパティを持つ。
  • 値が "GeneratorFunction" である "name" プロパティを持つ。
  • 次のプロパティを持つ:

27.3.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype の初期値は GeneratorFunction プロトタイプオブジェクトである。

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

27.3.3 GeneratorFunction プロトタイプオブジェクトのプロパティ

GeneratorFunction プロトタイプオブジェクト

  • %GeneratorFunction.prototype% である(Figure 6 を参照)。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、[[ECMAScriptCode]] 内部スロット、または Table 25 もしくは Table 89 に列挙されるその他の内部スロットを持たない。
  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。

27.3.3.1 GeneratorFunction.prototype.constructor

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

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

27.3.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototype の初期値は %GeneratorPrototype% である。

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

27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "GeneratorFunction" である。

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

27.3.4 GeneratorFunction インスタンス

すべての GeneratorFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 25 に列挙される内部スロットを持つ。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false である。

各 GeneratorFunction インスタンスは、次の own プロパティを持つ:

27.3.4.1 length

20.2.4.1 で与えられる Function インスタンスの "length" プロパティの仕様は、GeneratorFunction インスタンスにも適用される。

27.3.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、GeneratorFunction インスタンスにも適用される。

27.3.4.3 prototype

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

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

Note

Function インスタンスとは異なり、GeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値が GeneratorFunction インスタンスである "constructor" プロパティを持たない。

27.4 AsyncGeneratorFunction オブジェクト

AsyncGeneratorFunction は、通常 AsyncGeneratorDeclarationAsyncGeneratorExpression、および AsyncGeneratorMethod 構文生成規則を評価することによって作成される関数である。%AsyncGeneratorFunction% intrinsic を呼び出すことによって作成されることもある。

27.4.1 AsyncGeneratorFunction コンストラクター

AsyncGeneratorFunction コンストラクター:

  • %AsyncGeneratorFunction% である。
  • Function のサブクラスである。
  • コンストラクターとしてではなく関数として呼び出されたとき、新しい AsyncGeneratorFunction を作成し初期化する。したがって、関数呼び出し AsyncGeneratorFunction (...) は、同じ引数を持つオブジェクト作成式 new AsyncGeneratorFunction (...) と等価である。
  • クラス定義の extends 節の値として使用してよい。指定された AsyncGeneratorFunction の動作を継承することを意図するサブクラスコンストラクターは、built-in AsyncGeneratorFunction の動作に必要な内部スロットを持つサブクラスインスタンスを作成し初期化するため、AsyncGeneratorFunction コンストラクターへの super 呼び出しを含まなければならない。async generator function オブジェクトを定義するすべての ECMAScript 構文形式は、AsyncGeneratorFunction の直接インスタンスを作成する。AsyncGeneratorFunction サブクラスのインスタンスを作成する構文上の手段は存在しない。

27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)は async generator function の本体(実行可能コード)を指定し、それより前の任意の引数は仮引数を指定する。

この関数は、呼び出されたとき次の手順を実行する:

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. bodyArg が存在しないならば、bodyArg を空の String に設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, async-generator, parameterArgs, bodyArg) を返す。
Note

20.2.1.1NOTE を参照。

27.4.2 AsyncGeneratorFunction コンストラクターのプロパティ

AsyncGeneratorFunction コンストラクター:

  • Function コンストラクターから継承する標準 built-in 関数オブジェクトである。
  • 値が %Function% である [[Prototype]] 内部スロットを持つ。
  • 値が 1𝔽 である "length" プロパティを持つ。
  • 値が "AsyncGeneratorFunction" である "name" プロパティを持つ。
  • 次のプロパティを持つ:

27.4.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype の初期値は AsyncGeneratorFunction プロトタイプオブジェクトである。

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

27.4.3 AsyncGeneratorFunction プロトタイプオブジェクトのプロパティ

AsyncGeneratorFunction プロトタイプオブジェクト

  • %AsyncGeneratorFunction.prototype% である。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、[[ECMAScriptCode]] 内部スロット、または Table 25 もしくは Table 90 に列挙されるその他の内部スロットを持たない。
  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。

27.4.3.1 AsyncGeneratorFunction.prototype.constructor

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

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

27.4.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototype の初期値は %AsyncGeneratorPrototype% である。

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

27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncGeneratorFunction" である。

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

27.4.4 AsyncGeneratorFunction インスタンス

すべての AsyncGeneratorFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 25 に列挙される内部スロットを持つ。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false である。

各 AsyncGeneratorFunction インスタンスは、次の own プロパティを持つ:

27.4.4.1 length

"length" プロパティの値は、AsyncGeneratorFunction が通常期待する引数の個数を示す整数の Number である。ただし、この言語は、関数が他の個数の引数で呼び出されることを許容する。"length" プロパティによって指定された個数以外の引数で呼び出されたときの AsyncGeneratorFunction の動作は、その関数に依存する。

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

27.4.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、AsyncGeneratorFunction インスタンスにも適用される。

27.4.4.3 prototype

AsyncGeneratorFunction インスタンスが作成されるたびに、別の通常のオブジェクトも作成され、それが async generator function の "prototype" プロパティの初期値となる。prototype プロパティの値は、generator function オブジェクトが [[Call]] を使用して呼び出されたときに、新しく作成される AsyncGenerator の [[Prototype]] 内部スロットを初期化するために使用される。

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

Note

function インスタンスとは異なり、AsyncGeneratorFunction の "prototype" プロパティの値であるオブジェクトは、その値が AsyncGeneratorFunction インスタンスである "constructor" プロパティを持たない。

27.5 Generator オブジェクト

Generator は generator function を呼び出すことによって作成され、iterator インターフェイスiterable インターフェイスの両方に適合する。

Generator インスタンスは、そのインスタンスを作成した generator function の "prototype" プロパティの初期値から直接プロパティを継承する。Generator インスタンスは %GeneratorPrototype% から間接的にプロパティを継承する。

27.5.1 %GeneratorPrototype% オブジェクト

%GeneratorPrototype% オブジェクト:

  • %GeneratorFunction.prototype.prototype% である。
  • 通常のオブジェクトである。
  • Generator インスタンスではなく、[[GeneratorState]] 内部スロットを持たない。
  • 値が %Iterator.prototype% である [[Prototype]] 内部スロットを持つ。
  • すべての Generator インスタンスによって間接的に継承されるプロパティを持つ。

27.5.1.1 %GeneratorPrototype%.constructor

%GeneratorPrototype%.constructor の初期値は %GeneratorFunction.prototype% である。

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

27.5.1.2 %GeneratorPrototype%.next ( value )

  1. GeneratorResume(this value, value, empty) を返す。

27.5.1.3 %GeneratorPrototype%.return ( value )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. generatorthis value とする。
  2. completionReturnCompletion(value) とする。
  3. GeneratorResumeAbrupt(generator, completion, empty) を返す。

27.5.1.4 %GeneratorPrototype%.throw ( exception )

このメソッドは、呼び出されたとき次の手順を実行する:

  1. generatorthis value とする。
  2. completionThrowCompletion(exception) とする。
  3. GeneratorResumeAbrupt(generator, completion, empty) を返す。

27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "Generator" である。

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

27.5.2 Generator インスタンスのプロパティ

Generator インスタンスは、Table 89 に記述される内部スロットを持って最初に作成される。

Table 89: Generator インスタンスの内部スロット
内部スロット 説明
[[GeneratorState]] suspended-start, suspended-yield, executing, または completed generator の現在の実行状態。
[[GeneratorContext]] execution context この generator のコードを実行するときに使用される実行コンテキスト。
[[GeneratorBrand]] String または empty 異なる種類の generator を区別するために使用される brand。ECMAScript ソーステキストによって宣言された generator の [[GeneratorBrand]] は常に empty である。

27.5.3 Generator 抽象操作

27.5.3.1 GeneratorStart ( generator, generatorBody )

The abstract operation GeneratorStart takes arguments generator (Generator) and generatorBody (FunctionBody Parse Node またはパラメータを持たない Abstract Closure) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[GeneratorState]]suspended-start である。
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator コンポーネントを generator に設定する。
  4. closure を、generatorBody をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGeneratoracGenContext の Generator コンポーネントとする。
    3. generatorBodyParse Node であるならば、
      1. resultgeneratorBodyEvaluationCompletion とする。
    4. そうでなければ、
      1. Assert: generatorBody はパラメータを持たない Abstract Closure である。
      2. resultCompletion(generatorBody()) とする。
    5. Assert: ここに戻ってきたならば、generator は例外を投げたか、暗黙的または明示的な return のいずれかを実行した。
    6. acGenContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
    7. acGenerator.[[GeneratorState]]completed に設定する。
    8. NOTE: generator が completed 状態に入ると、それは二度とその状態を離れず、関連付けられた実行コンテキストは二度と再開されない。この時点で、acGenerator に関連付けられた任意の実行状態は破棄できる。
    9. resultnormal completion であるならば、
      1. resultValueundefined とする。
    10. そうではなく resultreturn completion であるならば、
      1. resultValueresult.[[Value]] とする。
    11. そうでなければ、
      1. Assert: resultthrow completion である。
      2. result を返す。
    12. NormalCompletion(CreateIteratorResultObject(resultValue, true)) を返す。
  5. genContext のコード評価状態を、その実行コンテキストについて評価が再開されたときに、closure が引数なしで呼び出されるように設定する。
  6. generator.[[GeneratorContext]]genContext に設定する。
  7. unused を返す。

27.5.3.2 GeneratorValidate ( generator, generatorBrand )

The abstract operation GeneratorValidate takes arguments generator (ECMAScript 言語値) and generatorBrand (String または empty) and returns suspended-startsuspended-yield、または completed のいずれかを含む normal completion、または throw completion のいずれか. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[GeneratorState]]) を実行する。
  2. RequireInternalSlot(generator, [[GeneratorBrand]]) を実行する。
  3. generator.[[GeneratorBrand]]generatorBrand でないならば、TypeError 例外を投げる。
  4. Assert: generator[[GeneratorContext]] 内部スロットを持つ。
  5. stategenerator.[[GeneratorState]] とする。
  6. stateexecuting であるならば、TypeError 例外を投げる。
  7. state を返す。

27.5.3.3 GeneratorResume ( generator, value, generatorBrand )

The abstract operation GeneratorResume takes arguments generator (ECMAScript 言語値), value (ECMAScript 言語値または empty), and generatorBrand (String または empty) and returns ECMAScript 言語値を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. state を ? GeneratorValidate(generator, generatorBrand) とする。
  2. statecompleted である場合、CreateIteratorResultObject(undefined, true) を返す。
  3. Assert: statesuspended-start または suspended-yield のいずれかである。
  4. genContextgenerator.[[GeneratorContext]] とする。
  5. generator.[[GeneratorState]]executing に設定する。
  6. RunSuspendedContext(genContext, NormalCompletion(value)) を返す。

27.5.3.4 GeneratorResumeAbrupt ( generator, abruptCompletion, generatorBrand )

The abstract operation GeneratorResumeAbrupt takes arguments generator (ECMAScript 言語値), abruptCompletion (return completion または throw completion), and generatorBrand (String または empty) and returns ECMAScript 言語値を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. state を ? GeneratorValidate(generator, generatorBrand) とする。
  2. statesuspended-start である場合、
    1. generator.[[GeneratorState]]completed に設定する。
    2. NOTE: ジェネレーターはいったん completed 状態に入ると、そこから離れることはなく、それに関連付けられた実行コンテキストが再開されることもない。この時点で、generator に関連付けられた任意の実行状態を破棄できる。
    3. statecompleted に設定する。
  3. statecompleted である場合、
    1. abruptCompletion が return 完了である場合、
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true) を返す。
    2. abruptCompletion を返す。
  4. Assert: statesuspended-yield である。
  5. genContextgenerator.[[GeneratorContext]] とする。
  6. generator.[[GeneratorState]]executing に設定する。
  7. RunSuspendedContext(genContext, abruptCompletion) を返す。

27.5.3.5 GetGeneratorKind ( )

The abstract operation GetGeneratorKind takes no arguments and returns non-generator, sync, or async. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. genContext が Generator コンポーネントを持たないならば、non-generator を返す。
  3. generatorgenContext の Generator コンポーネントとする。
  4. generator[[AsyncGeneratorState]] 内部スロットを持つならば、async を返す。
  5. sync を返す。

27.5.3.6 GeneratorYield ( iteratorResult )

The abstract operation GeneratorYield takes argument iteratorResult (IteratorResult インターフェイスに適合する Object) and returns ECMAScript 言語値を含む normal completion または abrupt completion のいずれか. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. Assert: genContext は generator の実行コンテキストである。
  3. generatorgenContext の Generator コンポーネントの値とする。
  4. Assert: GetGeneratorKind() は sync である。
  5. generator.[[GeneratorState]]suspended-yield に設定する。
  6. genContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
  7. callerContext を実行中の実行コンテキストとする。
  8. NormalCompletion(iteratorResult) を渡して callerContext を再開する。genContext が再び再開された場合、resumptionValue をそれが再開された Completion Record とする。
  9. Assert: ここに制御が到達したならば、genContext は再び実行中の実行コンテキストである。
  10. resumptionValue を返す。

27.5.3.7 Yield ( value )

The abstract operation Yield takes argument value (ECMAScript 言語値) and returns ECMAScript 言語値を含む normal completion または abrupt completion のいずれか. It performs the following steps when called:

  1. generatorKindGetGeneratorKind() とする。
  2. generatorKindasync であるならば、? AsyncGeneratorYield(? Await(value)) を返す。
  3. GeneratorYield(CreateIteratorResultObject(value, false)) を返す。

27.5.3.8 CreateIteratorFromClosure ( closure, generatorBrand, generatorPrototype [ , extraSlots ] )

The abstract operation CreateIteratorFromClosure takes arguments closure (パラメータを持たない Abstract Closure), generatorBrand (String または empty), and generatorPrototype (Object) and optional argument extraSlots (内部スロット名の List) and returns Generator. It performs the following steps when called:

  1. NOTE: closure は、IteratorResult オブジェクトを yield するために Yield 操作の使用を含むことができる。
  2. extraSlots が存在しないならば、extraSlots を新しい空の List に設定する。
  3. internalSlotsListextraSlots と « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] » のリスト連結とする。
  4. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList) とする。
  5. generator.[[GeneratorBrand]]generatorBrand に設定する。
  6. generator.[[GeneratorState]]suspended-start に設定する。
  7. callerContext を実行中の実行コンテキストとする。
  8. calleeContext を新しい実行コンテキストとする。
  9. calleeContext の Function を null に設定する。
  10. calleeContextRealm を現在の Realm Record に設定する。
  11. calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。
  12. callerContext がまだ suspended でないならば、callerContext を suspend する。
  13. calleeContext を実行コンテキストスタックに push する。calleeContext はここで実行中の実行コンテキストとなる。
  14. GeneratorStart(generator, closure) を実行する。
  15. calleeContext を実行コンテキストスタックから取り除き、callerContext を実行中の実行コンテキストとして復元する。
  16. generator を返す。

27.6 AsyncGenerator オブジェクト

AsyncGenerator は async generator function を呼び出すことによって作成され、async iterator インターフェイスasync iterable インターフェイスの両方に適合する。

AsyncGenerator インスタンスは、そのインスタンスを作成した async generator function の "prototype" プロパティの初期値から直接プロパティを継承する。AsyncGenerator インスタンスは %AsyncGeneratorPrototype% から間接的にプロパティを継承する。

27.6.1 %AsyncGeneratorPrototype% オブジェクト

%AsyncGeneratorPrototype% オブジェクト:

  • %AsyncGeneratorFunction.prototype.prototype% である。
  • 通常のオブジェクトである。
  • AsyncGenerator インスタンスではなく、[[AsyncGeneratorState]] 内部スロットを持たない。
  • 値が %AsyncIteratorPrototype% である [[Prototype]] 内部スロットを持つ。
  • すべての AsyncGenerator インスタンスによって間接的に継承されるプロパティを持つ。

27.6.1.1 %AsyncGeneratorPrototype%.constructor

%AsyncGeneratorPrototype%.constructor の初期値は %AsyncGeneratorFunction.prototype% である。

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

27.6.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. generatorthis value とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. stategenerator.[[AsyncGeneratorState]] とする。
  6. statecompleted であるならば、
    1. iteratorResultCreateIteratorResultObject(undefined, true) とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
    3. promiseCapability.[[Promise]] を返す。
  7. completionNormalCompletion(value) とする。
  8. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  9. statesuspended-start または suspended-yield のいずれかであるならば、
    1. AsyncGeneratorResume(generator, completion) を実行する。
  10. そうでなければ、
    1. Assert: stateexecuting または draining-queue のいずれかである。
  11. promiseCapability.[[Promise]] を返す。

27.6.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. generatorthis value とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. completionReturnCompletion(value) とする。
  6. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  7. stategenerator.[[AsyncGeneratorState]] とする。
  8. statesuspended-start または completed のいずれかであるならば、
    1. generator.[[AsyncGeneratorState]]draining-queue に設定する。
    2. AsyncGeneratorAwaitReturn(generator) を実行する。
  9. そうではなく statesuspended-yield であるならば、
    1. AsyncGeneratorResume(generator, completion) を実行する。
  10. そうでなければ、
    1. Assert: stateexecuting または draining-queue のいずれかである。
  11. promiseCapability.[[Promise]] を返す。

27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. generatorthis value とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. resultCompletion(AsyncGeneratorValidate(generator, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. stategenerator.[[AsyncGeneratorState]] とする。
  6. statesuspended-start であるならば、
    1. generator.[[AsyncGeneratorState]]completed に設定する。
    2. statecompleted に設定する。
  7. statecompleted であるならば、
    1. Call(promiseCapability.[[Reject]], undefined, « exception ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  8. completionThrowCompletion(exception) とする。
  9. AsyncGeneratorEnqueue(generator, completion, promiseCapability) を実行する。
  10. statesuspended-yield であるならば、
    1. AsyncGeneratorResume(generator, completion) を実行する。
  11. そうでなければ、
    1. Assert: stateexecuting または draining-queue のいずれかである。
  12. promiseCapability.[[Promise]] を返す。

27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncGenerator" である。

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

27.6.2 AsyncGenerator インスタンスのプロパティ

AsyncGenerator インスタンスは、以下に記述される内部スロットを持って最初に作成される:

Table 90: AsyncGenerator インスタンスの内部スロット
内部スロット 説明
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, または completed async generator の現在の実行状態。
[[AsyncGeneratorContext]] execution context この async generator のコードを実行するときに使用される実行コンテキスト。
[[AsyncGeneratorQueue]] AsyncGeneratorRequest RecordList async generator を再開する要求を表す Record。状態遷移中を除き、[[AsyncGeneratorState]]executing または draining-queue のいずれかである場合に、かつその場合に限り空でない。
[[GeneratorBrand]] String または empty 異なる種類の async generator を区別するために使用される brand。ECMAScript ソーステキストによって宣言された async generator の [[GeneratorBrand]] は常に empty である。

27.6.3 AsyncGenerator 抽象操作

27.6.3.1 AsyncGeneratorRequest Record

AsyncGeneratorRequest は、async generator がどのように再開されるべきかについての情報を格納するために使用され、対応する promise を fulfill または reject するための capability を含む Record 値である。

これは次のフィールドを持つ:

Table 91: AsyncGeneratorRequest Record のフィールド
フィールド名 意味
[[Completion]] Completion Record async generator を再開するために使用されるべき Completion Record
[[Capability]] PromiseCapability Record この要求に関連付けられた promise capability。

27.6.3.2 AsyncGeneratorStart ( generator, generatorBody )

The abstract operation AsyncGeneratorStart takes arguments generator (AsyncGenerator) and generatorBody (FunctionBody Parse Node またはパラメータを持たない Abstract Closure) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]suspended-start である。
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator コンポーネントを generator に設定する。
  4. closure を、generatorBody をキャプチャし、呼び出されたときに次の手順を実行する、パラメータを持たない新しい Abstract Closure とする:
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGeneratoracGenContext の Generator コンポーネントとする。
    3. generatorBodyParse Node であるならば、
      1. resultgeneratorBodyEvaluationCompletion とする。
    4. そうでなければ、
      1. Assert: generatorBody はパラメータを持たない Abstract Closure である。
      2. resultCompletion(generatorBody()) とする。
    5. Assert: ここに戻ってきたならば、async generator は例外を投げたか、暗黙的または明示的な return のいずれかを実行した。
    6. acGenContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
    7. acGenerator.[[AsyncGeneratorState]]draining-queue に設定する。
    8. resultnormal completion であるならば、resultNormalCompletion(undefined) に設定する。
    9. resultreturn completion であるならば、resultNormalCompletion(result.[[Value]]) に設定する。
    10. AsyncGeneratorCompleteStep(acGenerator, result, true) を実行する。
    11. AsyncGeneratorDrainQueue(acGenerator) を実行する。
    12. NormalCompletion(undefined) を返す。
  5. genContext のコード評価状態を、その実行コンテキストについて評価が再開されたときに、closure が引数なしで呼び出されるように設定する。
  6. generator.[[AsyncGeneratorContext]]genContext に設定する。
  7. generator.[[AsyncGeneratorQueue]] を新しい空の List に設定する。
  8. unused を返す。

27.6.3.3 AsyncGeneratorValidate ( generator, generatorBrand )

The abstract operation AsyncGeneratorValidate takes arguments generator (ECMAScript 言語値) and generatorBrand (String または empty) and returns unused を含む normal completion または throw completion のいずれか. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[AsyncGeneratorContext]]) を実行する。
  2. RequireInternalSlot(generator, [[AsyncGeneratorState]]) を実行する。
  3. RequireInternalSlot(generator, [[AsyncGeneratorQueue]]) を実行する。
  4. generator.[[GeneratorBrand]]generatorBrand でないならば、TypeError 例外を投げる。
  5. unused を返す。

27.6.3.4 AsyncGeneratorEnqueue ( generator, completion, promiseCapability )

The abstract operation AsyncGeneratorEnqueue takes arguments generator (AsyncGenerator), completion (Completion Record), and promiseCapability (PromiseCapability Record) and returns unused. It performs the following steps when called:

  1. requestAsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability } とする。
  2. requestgenerator.[[AsyncGeneratorQueue]] に追加する。
  3. unused を返す。

27.6.3.5 AsyncGeneratorCompleteStep ( generator, completion, done [ , realm ] )

The abstract operation AsyncGeneratorCompleteStep takes arguments generator (AsyncGenerator), completion (Completion Record), and done (Boolean) and optional argument realm (Realm Record) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorQueue]] は空でない。
  2. nextgenerator.[[AsyncGeneratorQueue]] の最初の要素とする。
  3. 最初の要素を generator.[[AsyncGeneratorQueue]] から取り除く。
  4. promiseCapabilitynext.[[Capability]] とする。
  5. valuecompletion.[[Value]] とする。
  6. completionthrow completion であるならば、
    1. Call(promiseCapability.[[Reject]], undefined, « value ») を実行する。
  7. そうでなければ、
    1. Assert: completionnormal completion である。
    2. realm が存在するならば、
      1. oldRealm を実行中の実行コンテキストの Realm とする。
      2. 実行中の実行コンテキストの Realmrealm に設定する。
      3. iteratorResultCreateIteratorResultObject(value, done) とする。
      4. 実行中の実行コンテキストの RealmoldRealm に設定する。
    3. そうでなければ、
      1. iteratorResultCreateIteratorResultObject(value, done) とする。
    4. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
  8. unused を返す。

27.6.3.6 AsyncGeneratorResume ( generator, completion )

The abstract operation AsyncGeneratorResume takes arguments generator (AsyncGenerator) and completion (Completion Record) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]suspended-start または suspended-yield のいずれかである。
  2. genContextgenerator.[[AsyncGeneratorContext]] とする。
  3. generator.[[AsyncGeneratorState]]executing に設定する。
  4. RunSuspendedContext(genContext, completion) を実行する。
  5. unused を返す。

27.6.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (Completion Record) and returns ECMAScript 言語値を含む normal completion または abrupt completion のいずれか. It performs the following steps when called:

  1. resumptionValuereturn completion でないならば、? resumptionValue を返す。
  2. awaitedCompletion(Await(resumptionValue.[[Value]])) とする。
  3. awaitedthrow completion であるならば、? awaited を返す。
  4. Assert: awaitednormal completion である。
  5. ReturnCompletion(awaited.[[Value]]) を返す。

27.6.3.8 AsyncGeneratorYield ( value )

The abstract operation AsyncGeneratorYield takes argument value (ECMAScript 言語値) and returns ECMAScript 言語値を含む normal completion または abrupt completion のいずれか. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. Assert: genContext は generator の実行コンテキストである。
  3. generatorgenContext の Generator コンポーネントの値とする。
  4. Assert: GetGeneratorKind() は async である。
  5. completionNormalCompletion(value) とする。
  6. Assert: 実行コンテキストスタックは少なくとも 2 つの要素を持つ。
  7. previousContext を実行コンテキストスタックの上から 2 番目の要素とする。
  8. previousRealmpreviousContextRealm とする。
  9. AsyncGeneratorCompleteStep(generator, completion, false, previousRealm) を実行する。
  10. queuegenerator.[[AsyncGeneratorQueue]] とする。
  11. queue が空でないならば、
    1. NOTE: 実行は generator を suspend せずに継続する。
    2. toYieldqueue の最初の要素とする。
    3. resumptionValueCompletion(toYield.[[Completion]]) とする。
    4. AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。
  12. generator.[[AsyncGeneratorState]]suspended-yield に設定する。
  13. genContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
  14. callerContext を実行中の実行コンテキストとする。
  15. undefined を渡して callerContext を再開する。genContext が再び再開された場合、resumptionValue をそれが再開された Completion Record とする。
  16. Assert: ここに制御が到達したならば、genContext は再び実行中の実行コンテキストである。
  17. AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。

27.6.3.9 AsyncGeneratorAwaitReturn ( generator )

The abstract operation AsyncGeneratorAwaitReturn takes argument generator (AsyncGenerator) and returns unused. It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]draining-queue である。
  2. queuegenerator.[[AsyncGeneratorQueue]] とする。
  3. Assert: queue は空でない。
  4. nextqueue の最初の要素とする。
  5. completionCompletion(next.[[Completion]]) とする。
  6. Assert: completionreturn completion である。
  7. promiseCompletionCompletion(PromiseResolve(%Promise%, completion.[[Value]])) とする。
  8. promiseCompletionabrupt completion であるならば、
    1. AsyncGeneratorCompleteStep(generator, promiseCompletion, true) を実行する。
    2. AsyncGeneratorDrainQueue(generator) を実行する。
    3. unused を返す。
  9. Assert: promiseCompletionnormal completion である。
  10. promisepromiseCompletion.[[Value]] とする。
  11. fulfilledClosure を、generator をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (value) を持つ新しい Abstract Closure とする:
    1. Assert: generator.[[AsyncGeneratorState]]draining-queue である。
    2. resultNormalCompletion(value) とする。
    3. AsyncGeneratorCompleteStep(generator, result, true) を実行する。
    4. AsyncGeneratorDrainQueue(generator) を実行する。
    5. NormalCompletion(undefined) を返す。
  12. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  13. rejectedClosure を、generator をキャプチャし、呼び出されたときに次の手順を実行する、パラメータ (reason) を持つ新しい Abstract Closure とする:
    1. Assert: generator.[[AsyncGeneratorState]]draining-queue である。
    2. resultThrowCompletion(reason) とする。
    3. AsyncGeneratorCompleteStep(generator, result, true) を実行する。
    4. AsyncGeneratorDrainQueue(generator) を実行する。
    5. NormalCompletion(undefined) を返す。
  14. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  15. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  16. unused を返す。

27.6.3.10 AsyncGeneratorDrainQueue ( generator )

The abstract operation AsyncGeneratorDrainQueue takes argument generator (AsyncGenerator) and returns unused. これは、return completion を保持する AsyncGeneratorRequest に遭遇するまで、generator の AsyncGeneratorQueue を drain する。 It performs the following steps when called:

  1. Assert: generator.[[AsyncGeneratorState]]draining-queue である。
  2. queuegenerator.[[AsyncGeneratorQueue]] とする。
  3. queue が空でない間、繰り返す:
    1. nextqueue の最初の要素とする。
    2. completionCompletion(next.[[Completion]]) とする。
    3. completionreturn completion であるならば、
      1. AsyncGeneratorAwaitReturn(generator) を実行する。
      2. unused を返す。
    4. completionnormal completion であるならば、
      1. completionNormalCompletion(undefined) に設定する。
    5. AsyncGeneratorCompleteStep(generator, completion, true) を実行する。
  4. generator.[[AsyncGeneratorState]]completed に設定する。
  5. unused を返す。

27.7 AsyncFunction オブジェクト

AsyncFunction は、通常 AsyncFunctionDeclarationAsyncFunctionExpressionAsyncMethod、および AsyncArrowFunction を評価することによって作成される関数である。%AsyncFunction% intrinsic を呼び出すことによって作成されることもある。

27.7.1 AsyncFunction コンストラクター

AsyncFunction コンストラクター:

  • %AsyncFunction% である。
  • Function のサブクラスである。
  • コンストラクターとしてではなく関数として呼び出されたとき、新しい AsyncFunction を作成し初期化する。したがって、関数呼び出し AsyncFunction(…) は、同じ引数を持つオブジェクト作成式 new AsyncFunction(…) と等価である。
  • クラス定義の extends 節の値として使用してよい。指定された AsyncFunction の動作を継承することを意図するサブクラスコンストラクターは、built-in async function の動作に必要な内部スロットを持つサブクラスインスタンスを作成し初期化するため、AsyncFunction コンストラクターへの super 呼び出しを含まなければならない。async function オブジェクトを定義するすべての ECMAScript 構文形式は、AsyncFunction の直接インスタンスを作成する。AsyncFunction サブクラスのインスタンスを作成する構文上の手段は存在しない。

27.7.1.1 AsyncFunction ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)は async function の本体(実行可能コード)を指定する。それより前の任意の引数は仮引数を指定する。

この関数は、呼び出されたとき次の手順を実行する:

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. bodyArg が存在しないならば、bodyArg を空の String に設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, async, parameterArgs, bodyArg) を返す。
Note
20.2.1.1NOTE を参照。

27.7.2 AsyncFunction コンストラクターのプロパティ

AsyncFunction コンストラクター:

  • Function コンストラクターから継承する標準 built-in 関数オブジェクトである。
  • 値が %Function% である [[Prototype]] 内部スロットを持つ。
  • 値が 1𝔽 である "length" プロパティを持つ。
  • 値が "AsyncFunction" である "name" プロパティを持つ。
  • 次のプロパティを持つ:

27.7.2.1 AsyncFunction.prototype

AsyncFunction.prototype の初期値は AsyncFunction プロトタイプオブジェクトである。

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

27.7.3 AsyncFunction プロトタイプオブジェクトのプロパティ

AsyncFunction プロトタイプオブジェクト

  • %AsyncFunction.prototype% である。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、[[ECMAScriptCode]] 内部スロット、または Table 25 に列挙されるその他の内部スロットを持たない。
  • 値が %Function.prototype% である [[Prototype]] 内部スロットを持つ。

27.7.3.1 AsyncFunction.prototype.constructor

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

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

27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncFunction" である。

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

27.7.4 AsyncFunction インスタンス

すべての AsyncFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 25 に列挙される内部スロットを持つ。そのようなすべてのインスタンスについて、[[IsClassConstructor]] 内部スロットの値は false である。AsyncFunction インスタンスはコンストラクターではなく、[[Construct]] 内部メソッドを持たない。AsyncFunction インスタンスは constructable ではないため、prototype プロパティを持たない。

各 AsyncFunction インスタンスは、次の own プロパティを持つ:

27.7.4.1 length

20.2.4.1 で与えられる Function インスタンスの "length" プロパティの仕様は、AsyncFunction インスタンスにも適用される。

27.7.4.2 name

20.2.4.2 で与えられる Function インスタンスの "name" プロパティの仕様は、AsyncFunction インスタンスにも適用される。

27.7.5 Async Functions 抽象操作

27.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody )

The abstract operation AsyncFunctionStart takes arguments promiseCapability (PromiseCapability Record) and asyncFunctionBody (FunctionBody Parse NodeExpressionBody Parse Node、またはパラメータを持たない Abstract Closure) and returns unused. It performs the following steps when called:

  1. runningContext を実行中の実行コンテキストとする。
  2. asyncContextrunningContext のコピーとする。
  3. NOTE: 実行状態のコピーは、AsyncBlockStart がその実行を再開するために必要である。現在実行中のコンテキストを再開することは未定義である。
  4. AsyncBlockStart(promiseCapability, asyncFunctionBody, asyncContext) を実行する。
  5. unused を返す。

27.7.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

The abstract operation AsyncBlockStart takes arguments promiseCapability (PromiseCapability Record), asyncBody (Parse Node またはパラメータを持たない Abstract Closure), and asyncContext (execution context) and returns unused. It performs the following steps when called:

  1. closure を、パラメーターを持たず、promiseCapabilityasyncBody を捕捉する新しい抽象クロージャーとし、呼び出されたときに次の手順を実行するものとする:
    1. acAsyncContext を実行中の実行コンテキストとする。
    2. asyncBody が構文解析ノードである場合、
      1. resultCompletion(asyncBody の評価) とする。
    3. そうでない場合、
      1. Assert: asyncBody はパラメーターを持たない抽象クロージャーである。
      2. resultCompletion(asyncBody()) とする。
    4. Assert: ここに戻ってきた場合、その async 関数は例外を投げたか、暗黙的または明示的な return を実行したかのいずれかであり、すべての await は完了している。
    5. acAsyncContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの先頭にある実行コンテキストを実行中の実行コンテキストとして復元する。
    6. result が正常完了である場合、
      1. Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行する。
    7. そうでなく result が return 完了である場合、
      1. Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] ») を実行する。
    8. そうでない場合、
      1. Assert: result は throw 完了である。
      2. Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») を実行する。
    9. NormalCompletion(unused) を返す。
  2. asyncContext のコード評価状態を、当該実行コンテキストについて評価が再開されたときに closure が引数なしで呼び出されるように設定する。
  3. result を ! RunSuspendedContext(asyncContext, NormalCompletion(empty)) とする。
  4. Assert: resultunused である。
  5. NOTE: result 値の可能な発生源は Await、または async 関数が何も await しない場合は上記のステップ 1.i である。
  6. unused を返す。

27.7.5.3 Await ( value )

The abstract operation Await takes argument value (ECMAScript 言語値) and returns ECMAScript 言語値または empty のいずれかを含む normal completion、または throw completion のいずれか. It performs the following steps when called:

  1. asyncContext を実行中の実行コンテキストとする。
  2. promise を ? PromiseResolve(%Promise%, value) とする。
  3. fulfilledClosure を、パラメーター (v) を持ち、asyncContext を捕捉する新しい抽象クロージャーとし、呼び出されたときに次の手順を実行するものとする:
    1. Completion(RunSuspendedContext(asyncContext, NormalCompletion(v))) を実行する。
    2. NOTE: RunSuspendedContext によって返される完了レコードは意図的に無視される。
    3. NormalCompletion(undefined) を返す。
  4. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  5. rejectedClosure を、パラメーター (reason) を持ち、asyncContext を捕捉する新しい抽象クロージャーとし、呼び出されたときに次の手順を実行するものとする:
    1. Completion(RunSuspendedContext(asyncContext, ThrowCompletion(reason))) を実行する。
    2. NOTE: RunSuspendedContext によって返される完了レコードは意図的に無視される。
    3. NormalCompletion(undefined) を返す。
  6. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  7. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  8. asyncContext を実行コンテキストスタックから取り除き、実行コンテキストスタックの先頭にある実行コンテキストを実行中の実行コンテキストとして復元する。
  9. callerContext を実行中の実行コンテキストとする。
  10. empty を渡して callerContext を再開する。asyncContext が再び再開されることがあれば、それが再開されるときの完了レコードを completion とする。
  11. Assert: 制御がここに到達した場合、asyncContext は再び実行中の実行コンテキストである。
  12. completion を返す。