27 制御抽象オブジェクト (Control Abstraction Objects)

27.1 反復 (Iteration)

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

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

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

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

Table 80: Iterable インタフェース 必須プロパティ (Iterable Interface Required Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
%Symbol.iterator% イテレータオブジェクトを返す関数 (a function that returns an iterator object) 返されるオブジェクトは iterator インタフェースに適合しなければならない (The returned object must conform to the iterator interface).

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

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

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

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

Table 82: Iterator インタフェース 任意プロパティ (Iterator Interface Optional Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"return" IteratorResult オブジェクトを返す関数 (a function that returns an IteratorResult object) 返されるオブジェクトは IteratorResult インタフェースに適合しなければならない。このメソッドの呼び出しは、呼び出し側がこれ以上そのイテレータの next メソッドを呼び出す意図がないことをイテレータオブジェクトへ通知する。返される IteratorResult オブジェクトは典型的に "done" プロパティが true の値を持ち、return メソッドの引数として渡された値を持つ "value" プロパティを持つ。しかしこの要件は強制されない。
"throw" IteratorResult オブジェクトを返す関数 (a function that returns an IteratorResult object) 返されるオブジェクトは IteratorResult インタフェースに適合しなければならない。このメソッドの呼び出しは、呼び出し側がエラー状態を検出したことをイテレータオブジェクトに通知する。引数はエラー状態を識別するために用いることができ、典型的には例外オブジェクトである。典型的な応答はその引数値を throw することである。メソッドが throw しない場合、返される IteratorResult オブジェクトは通常 "done" プロパティが true の値を持つ。
Note 2

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

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

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

Table 83: Async Iterable インタフェース 必須プロパティ (Async Iterable Interface Required Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
%Symbol.asyncIterator% 非同期イテレータオブジェクトを返す関数 (a function that returns an async iterator object) 返されるオブジェクトは async iterator インタフェースに適合しなければならない (The returned object must conform to the async iterator interface).

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

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

Table 84: Async Iterator インタフェース 必須プロパティ (Async Iterator Interface Required Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"next" IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object)

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

さらに、履行値となる IteratorResult オブジェクトの "value" プロパティの値は promise(または「thenable」)でないべきである。これも強制されない。

Note 1

next 関数には引数を渡せるが、その解釈と妥当性は対象となる async イテレータに依存する。for-await-of 文および他の一般的な async イテレータ利用者は引数を渡さないため、そのような利用を想定する async イテレータオブジェクトは引数なし呼び出しに備える必要がある。

Table 85: Async Iterator インタフェース 任意プロパティ (Async Iterator Interface Optional Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"return" IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object)

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

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

"throw" IteratorResult オブジェクトの promise を返す関数 (a function that returns a promise for an IteratorResult object)

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

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

Note 2

通常これらのメソッドの呼び出し側は存在確認を行ってから呼び出すべきである。for-await-ofyield* を含む特定の ECMAScript 言語機能は存在確認後にこれらを呼び出す。

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

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

Table 86: IteratorResult インタフェース プロパティ (IteratorResult Interface Properties)
プロパティ (Property) 値 (Value) 要件 (Requirements)
"done" 真偽値 (a Boolean) これはイテレータの next メソッド呼び出しの結果状態である。イテレータの終端に到達した場合 "done"true。終端でない場合 "done"false で値が利用可能。"done" プロパティ(自身または継承)が存在しない場合、その値は false と見なされる。
"value" ECMAScript 言語値 (an ECMAScript language value) done が false の場合、これは現在の反復要素の値。done が true の場合、(提供されたなら)イテレータの戻り値。イテレータに戻り値がない場合 "value"undefined。その場合、明示的な "value" プロパティを継承していなければ、適合オブジェクトから "value" プロパティを省いてもよい。

27.1.2 イテレータヘルパーオブジェクト (Iterator Helper Objects)

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

27.1.2.1 %IteratorHelperPrototype% オブジェクト (The %IteratorHelperPrototype% Object)

%IteratorHelperPrototype% オブジェクト:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

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

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[UnderlyingIterator]]) を実行する。
  3. 事前条件: O[[GeneratorState]] 内部スロットを持つ。
  4. もし O.[[GeneratorState]]suspended-start なら
    1. O.[[GeneratorState]]completed に設定する。
    2. 注: 一度 generator が completed 状態になると離脱せず、その関連実行コンテキストは再開されない。O に関連する任意の実行状態はここで破棄できる。
    3. IteratorClose(O.[[UnderlyingIterator]], NormalCompletion(unused)) を実行する。
    4. CreateIteratorResultObject(undefined, true) を返す。
  5. CReturnCompletion(undefined) とする。
  6. GeneratorResumeAbrupt(O, C, "Iterator Helper") を返す。

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

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

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

27.1.3 イテレータオブジェクト (Iterator Objects)

27.1.3.1 Iterator コンストラクタ (The Iterator Constructor)

Iterator コンストラクタ:

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

27.1.3.1.1 Iterator ( )

この関数は呼び出されると次を実行する:

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

27.1.3.2 Iterator コンストラクタのプロパティ (Properties of the Iterator Constructor)

Iterator コンストラクタ:

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

27.1.3.2.1 Iterator.from ( O )

  1. iteratorRecord を ? GetIteratorFlattenable(O, 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.1.1 %WrapForValidIteratorPrototype% オブジェクト (The %WrapForValidIteratorPrototype% Object)

%WrapForValidIteratorPrototype% オブジェクト:

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

27.1.3.2.1.1.1 %WrapForValidIteratorPrototype%.next ( )

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[Iterated]]) を実行する。
  3. iteratorRecordO.[[Iterated]] とする。
  4. ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) を返す。

27.1.3.2.1.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. Othis 値とする。
  2. RequireInternalSlot(O, [[Iterated]]) を実行する。
  3. iteratorO.[[Iterated]].[[Iterator]] とする。
  4. 事前条件: iterator は Object。
  5. returnMethod を ? GetMethod(iterator, "return") とする。
  6. もし returnMethodundefined なら
    1. CreateIteratorResultObject(undefined, true) を返す。
  7. ? Call(returnMethod, iterator) を返す。

27.1.3.2.2 Iterator.prototype

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

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

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

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

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

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

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

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

27.1.4.1 Iterator.prototype.constructor

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

27.1.4.1.1 get Iterator.prototype.constructor

[[Get]] 属性の値は引数を必要としない組み込み関数であり、呼び出されると次を実行する:

  1. %Iterator% を返す。

27.1.4.1.2 set Iterator.prototype.constructor

[[Set]] 属性の値は引数 v を取る組み込み関数であり、呼び出されると次を実行する:

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

ほとんどの組み込みプロトタイプ上の "constructor" プロパティと異なり、Web 互換性の理由からこのプロパティはアクセサでなければならない。

27.1.4.2 Iterator.prototype.drop ( limit )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[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(O) に設定する。
  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%, « [[UnderlyingIterator]] ») とする。
  12. result.[[UnderlyingIterator]]iterated を設定する。
  13. result を返す。

27.1.4.3 Iterator.prototype.every ( predicate )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(predicate) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  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.4.4 Iterator.prototype.filter ( predicate )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(predicate) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  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%, « [[UnderlyingIterator]] ») とする。
  8. result.[[UnderlyingIterator]]iterated を設定する。
  9. result を返す。

27.1.4.5 Iterator.prototype.find ( predicate )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(predicate) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  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.4.6 Iterator.prototype.flatMap ( mapper )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(mapper) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  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%, « [[UnderlyingIterator]] ») とする。
  8. result.[[UnderlyingIterator]]iterated を設定する。
  9. result を返す。

27.1.4.7 Iterator.prototype.forEach ( procedure )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(procedure) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  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.4.8 Iterator.prototype.map ( mapper )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(mapper) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  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%, « [[UnderlyingIterator]] ») とする。
  8. result.[[UnderlyingIterator]]iterated を設定する。
  9. result を返す。

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

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(reducer) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  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.4.10 Iterator.prototype.some ( predicate )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. もし IsCallable(predicate) が false なら
    1. errorThrowCompletion(新しく生成された TypeError オブジェクト) とする。
    2. IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(O) に設定する。
  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.4.11 Iterator.prototype.take ( limit )

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

  1. Othis 値とする。
  2. もし O が Object でなければ TypeError 例外を投げる。
  3. iteratedIterator Record { [[Iterator]]: O, [[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(O) に設定する。
  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%, « [[UnderlyingIterator]] ») とする。
  12. result.[[UnderlyingIterator]]iterated を設定する。
  13. result を返す。

27.1.4.12 Iterator.prototype.toArray ( )

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

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

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

この関数は呼び出されると次を実行する:

  1. this 値を返す。

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

27.1.4.14 Iterator.prototype [ %Symbol.toStringTag% ]

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

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

[[Get]] 属性の値は引数を必要としない組み込み関数であり、呼び出されると次を実行する:

  1. "Iterator" を返す。

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

[[Set]] 属性の値は引数 v を取る組み込み関数であり、呼び出されると次を実行する:

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

ほとんどの組み込みプロトタイプ上の %Symbol.toStringTag% プロパティと異なり、Web 互換性の理由からこのプロパティはアクセサでなければならない。

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

%AsyncIteratorPrototype% オブジェクト:

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

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

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

この関数は呼び出されると次を実行する:

  1. this 値を返す。

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

27.1.6 同期イテレータからの非同期イテレータオブジェクト (Async-from-Sync Iterator Objects)

Async-from-Sync Iterator オブジェクト は特定の同期イテレータを適応させる async イテレータである。Async-from-Sync Iterator オブジェクトは ECMAScript コードから直接アクセスされることはない。名前付きコンストラクタは存在せず、必要に応じて抽象操作 CreateAsyncFromSyncIterator によって生成される。

27.1.6.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (an 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.6.2 %AsyncFromSyncIteratorPrototype% オブジェクト (The %AsyncFromSyncIteratorPrototype% Object)

%AsyncFromSyncIteratorPrototype% オブジェクト:

27.1.6.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. Othis 値とする。
  2. 事前条件: O[[SyncIteratorRecord]] 内部スロットを持つ Object。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordO.[[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.6.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. Othis 値とする。
  2. 事前条件: O[[SyncIteratorRecord]] 内部スロットを持つ Object。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordO.[[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.6.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

Note
本仕様では value は常に提供されるが、%AsyncFromSyncIteratorPrototype%.return ( [ value ] ) との一貫性のため任意としている。
  1. Othis 値とする。
  2. 事前条件: O[[SyncIteratorRecord]] 内部スロットを持つ Object。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordO.[[SyncIteratorRecord]] とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]] とする。
  6. throwCompletion(GetMethod(syncIterator, "throw")) とする。
  7. IfAbruptRejectPromise(throw, promiseCapability)。
  8. もし throwundefined なら
    1. 注: syncIteratorthrow メソッドがない場合、capability を拒否する前にクリーンアップの機会を与えるため閉じる。
    2. closeCompletionNormalCompletion(empty) とする。
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion)) とする。
    4. IfAbruptRejectPromise(result, promiseCapability)。
    5. 注: 次のステップはプロトコル違反(syncIteratorthrow メソッドがない)を示す TypeError を投げる。
    6. 注: syncIterator の close が例外を投げない場合、その結果は無視される(拒否された 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.6.3 Async-from-Sync Iterator インスタンスのプロパティ (Properties of Async-from-Sync Iterator Instances)

Async-from-Sync Iterator インスタンスは %AsyncFromSyncIteratorPrototype% 組込みオブジェクトからプロパティを継承する通常のオブジェクトである。これらインスタンスは Table 87 に列挙される内部スロットを持って初期化される。

Table 87: Async-from-Sync Iterator インスタンスの内部スロット (Internal Slots of Async-from-Sync Iterator Instances)
内部スロット (Internal Slot) 型 (Type) 説明 (Description)
[[SyncIteratorRecord]] Iterator Record 適応対象となる元の同期イテレータを表す (Represents the original synchronous iterator which is being adapted).

27.1.6.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

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

  1. 注: promiseCapability は組込み %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 をパラメータ (v) を持ち done を捕捉し呼び出されると次を実行する新たな Abstract Closure とし、CreateIteratorResultObject(v, done) を返す。
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « ») とする。
  11. 注: onFulfilled は IteratorResult オブジェクトの "value" プロパティを処理する際、その値が promise であれば待機し、新たな「unwrapped」 IteratorResult オブジェクトとして再パッケージするために使用される。
  12. もし donetrue または closeOnRejectionfalse なら
    1. onRejectedundefined とする。
  13. それ以外
    1. closeIterator をパラメータ (error) を持ち syncIteratorRecord を捕捉し呼び出されると ? IteratorClose(syncIteratorRecord, ThrowCompletion(error)) を返す新たな Abstract Closure とする。
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « ») とする。
    3. 注: onRejected は IteratorResult オブジェクトが返す "value" プロパティが拒否された promise である場合に Iterator を close するために使用される。
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability) を実行する。
  15. promiseCapability.[[Promise]] を返す。

27.2 Promise オブジェクト

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

任意の Promise は互いに排他的な 3 つの状態のいずれかにある: fulfilled(履行済)、rejected(拒否済)、pending(保留):

  • Promise p が fulfilled であるとは、p.then(f, r) が直ちに関数 f を呼び出す Job をキューに入れる場合をいう。
  • Promise p が rejected であるとは、p.then(f, r) が直ちに関数 r を呼び出す Job をキューに入れる場合をいう。
  • Promise が pending であるとは、それが fulfilled でも rejected でもない場合をいう。

Promise が settled(確定)であるとは、それが pending でない(すなわち fulfilled か rejected である)ことをいう。

Promise が resolved であるとは、それが settled であるか、他の Promise の状態に一致するよう「ロックイン」された場合をいう。resolved な Promise をさらに resolve あるいは reject しようとしても効果はない。Promise が resolved でない場合、それは unresolved である。unresolved な Promise は常に pending 状態である。resolved な Promise は pending / fulfilled / rejected のいずれにもなり得る。

27.2.1 Promise の抽象操作

27.2.1.1 PromiseCapability レコード

PromiseCapability Record は、ある Promise(または Promise 風オブジェクト)と、それを解決または拒否できる関数をカプセル化するために用いられる Record 値である。PromiseCapability Record は抽象操作 NewPromiseCapability によって生成される。

PromiseCapability Record は Table 88 に列挙するフィールドを持つ。

Table 88: PromiseCapability Record フィールド
フィールド名 意味
[[Promise]] Object Promise として使用可能なオブジェクト。
[[Resolve]] 関数オブジェクト 対象の Promise を解決するために使われる関数。
[[Reject]] 関数オブジェクト 対象の Promise を拒否するために使われる関数。

27.2.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise は PromiseCapability Record を用いるアルゴリズム手順列の短縮記法である。次の形式のアルゴリズム手順:

  1. IfAbruptRejectPromise(value, capability).

は次と同じ意味である:

  1. 事前条件: valueCompletion Record である。
  2. もし valueabrupt completion なら
    1. ? Call(capability.[[Reject]], undefined, « value.[[Value]] ») を実行する。
    2. capability.[[Promise]] を返す。
  3. それ以外
    1. value を ! value に設定する。

27.2.1.2 PromiseReaction レコード

PromiseReaction Record は、ある Promise が特定の値で解決または拒否されたときにどのように反応すべきかを格納するための Record 値である。PromiseReaction Record は抽象操作 PerformPromiseThen によって生成され、NewPromiseReactionJob が返す Abstract Closure によって使用される。

PromiseReaction Record は Table 89 に列挙するフィールドを持つ。

Table 89: PromiseReaction Record フィールド
フィールド名 意味
[[Capability]] PromiseCapability Record または undefined このレコードがリアクションハンドラを提供する Promise のケイパビリティ。
[[Type]] fulfill または reject [[Handler]]empty のときに、確定種別固有の挙動を可能にするために使用される。
[[Handler]] JobCallback Record または empty 入力値に適用され、その戻り値が派生 Promise の挙動を決定する関数。[[Handler]]empty の場合、[[Type]] の値に依存した関数が代わりに使用される。

27.2.1.3 CreateResolvingFunctions ( promise )

The abstract operation CreateResolvingFunctions takes argument promise (a Promise) and returns [[Resolve]] (関数オブジェクト) および [[Reject]] (関数オブジェクト) フィールドを持つ Record. It performs the following steps when called:

  1. alreadyResolvedRecord { [[Value]]: false } とする。
  2. stepsResolvePromise Resolve 関数 で定義されるアルゴリズム手順とする。
  3. lengthResolvePromise Resolve 関数 にある関数定義の省略不可パラメータ数とする。
  4. resolveCreateBuiltinFunction(stepsResolve, lengthResolve, "", « [[Promise]], [[AlreadyResolved]] ») とする。
  5. resolve.[[Promise]]promise を設定する。
  6. resolve.[[AlreadyResolved]]alreadyResolved を設定する。
  7. stepsRejectPromise Reject 関数 で定義されるアルゴリズム手順とする。
  8. lengthRejectPromise Reject 関数 にある関数定義の省略不可パラメータ数とする。
  9. rejectCreateBuiltinFunction(stepsReject, lengthReject, "", « [[Promise]], [[AlreadyResolved]] ») とする。
  10. reject.[[Promise]]promise を設定する。
  11. reject.[[AlreadyResolved]]alreadyResolved を設定する。
  12. Record { [[Resolve]]: resolve, [[Reject]]: reject } を返す。

27.2.1.3.1 Promise Reject 関数

Promise reject 関数は [[Promise]][[AlreadyResolved]] 内部スロットを持つ匿名組み込み関数である。

Promise reject 関数が引数 reason で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. 事前条件: F は値が Object である [[Promise]] 内部スロットを持つ。
  3. promiseF.[[Promise]] とする。
  4. alreadyResolvedF.[[AlreadyResolved]] とする。
  5. もし alreadyResolved.[[Value]]true なら undefined を返す。
  6. alreadyResolved.[[Value]]true に設定する。
  7. RejectPromise(promise, reason) を実行する。
  8. undefined を返す。

Promise reject 関数の "length" プロパティは 1𝔽 である。

27.2.1.3.2 Promise Resolve 関数

Promise resolve 関数は [[Promise]][[AlreadyResolved]] 内部スロットを持つ匿名組み込み関数である。

Promise resolve 関数が引数 resolution で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. 事前条件: F は値が Object である [[Promise]] 内部スロットを持つ。
  3. promiseF.[[Promise]] とする。
  4. alreadyResolvedF.[[AlreadyResolved]] とする。
  5. もし alreadyResolved.[[Value]]true なら undefined を返す。
  6. alreadyResolved.[[Value]]true に設定する。
  7. もし SameValue(resolution, promise) が true なら
    1. selfResolutionError を新たに生成された TypeError オブジェクトとする。
    2. RejectPromise(promise, selfResolutionError) を実行する。
    3. undefined を返す。
  8. もし resolution が Object でなければ
    1. FulfillPromise(promise, resolution) を実行する。
    2. undefined を返す。
  9. thenCompletion(Get(resolution, "then")) とする。
  10. もし thenabrupt completion なら
    1. RejectPromise(promise, then.[[Value]]) を実行する。
    2. undefined を返す。
  11. thenActionthen.[[Value]] とする。
  12. もし IsCallable(thenAction) が false なら
    1. FulfillPromise(promise, resolution) を実行する。
    2. undefined を返す。
  13. thenJobCallbackHostMakeJobCallback(thenAction) とする。
  14. jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback) とする。
  15. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する。
  16. undefined を返す。

Promise resolve 関数の "length" プロパティは 1𝔽 である。

27.2.1.4 FulfillPromise ( promise, value )

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

  1. 事前条件: 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 ( C )

The abstract operation NewPromiseCapability takes argument C (an ECMAScript language value) and returns 正常完了で PromiseCapability Record を含むか、または throw completion. これは C を組み込み Promise コンストラクタと同様の方法でコンストラクタとして用いて Promise を生成し、その resolve / reject 関数を取得しようとする。得られた Promise と resolve / reject 関数によって新しい PromiseCapability Record を初期化する。 It performs the following steps when called:

  1. もし IsConstructor(C) が false なら TypeError 例外を投げる。
  2. 注: C は Promise コンストラクタのパラメータ規約(27.2.3.1 参照)をサポートするコンストラクタ関数であると仮定される。
  3. resolvingFunctionsRecord { [[Resolve]]: undefined, [[Reject]]: undefined } とする。
  4. executorClosure をパラメータ (resolve, reject) を持ち resolvingFunctions を捕捉し、呼び出されると次を行う新たな 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(C, « 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

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

27.2.1.6 IsPromise ( x )

The abstract operation IsPromise takes argument x (an ECMAScript language value) and returns Boolean. オブジェクト上の promise ブランドを確認する。 It performs the following steps when called:

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

27.2.1.7 RejectPromise ( promise, reason )

The abstract operation RejectPromise takes arguments promise (a Promise) and reason (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. 事前条件: 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 (a List of PromiseReaction Records) and argument (an ECMAScript language value) and returns unused. reactions の各レコードに対して新たな Job をキューに入れる。各 JobPromiseReaction 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 (a Promise) and operation ("reject" or "handle") and returns unused. ホスト環境が Promise の拒否を追跡できるようにする。

HostPromiseRejectionTracker のデフォルト実装は unused を返すことである。

Note 1

HostPromiseRejectionTracker は次の 2 つの状況で呼ばれる:

  • Promise がハンドラなしで拒否されたとき、operation 引数に "reject" を指定して呼ばれる。
  • 拒否済みの Promise に初めてハンドラが追加されたとき、operation 引数に "handle" を指定して呼ばれる。

典型的な実装は、未処理拒否を開発者に通知しようと試みる一方で、後からハンドラが追加されて以前の通知が無効化される場合にも注意深く通知する。

Note 2

operation"handle" の場合、実装はガベージコレクションを妨げる形で promise への参照を保持すべきではない。operation"reject" の場合には、拒否は稀でホットパスではないと期待されるため、実装は promise への参照を保持してもよい。

27.2.2 Promise の Job (Promise Jobs)

27.2.2.1 NewPromiseReactionJob ( reaction, argument )

The abstract operation NewPromiseReactionJob takes arguments reaction (a PromiseReaction Record) and argument (an ECMAScript language value) and returns フィールド [[Job]] (Job Abstract Closure) および [[Realm]] (Realm Record または null) を持つ Record. 受け取った値に適切なハンドラを適用し、その戻り値を用いてそのハンドラに関連付けられた派生 Promise を解決または拒否する新しい 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. 事前条件: typereject である。
        2. handlerResultThrowCompletion(argument) とする。
    5. それ以外
      1. handlerResultCompletion(HostCallJobCallback(handler, undefined, « argument »)) とする。
    6. もし promiseCapabilityundefined なら
      1. 事前条件: handlerResultabrupt completion ではない。
      2. empty を返す。
    7. 事前条件: promiseCapabilityPromiseCapability Record である。
    8. もし handlerResultabrupt completion なら
      1. ? Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] ») を返す。
    9. それ以外
      1. ? 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. 注: handlerRealmnull になるのはハンドラが undefined の場合に限られる。ハンドラが取り消された Proxy で ECMAScript コードが実行されない場合、handlerRealm はエラーオブジェクト生成に用いられる。
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm } を返す。

27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

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

  1. job を、引数なしで promiseToResolve, thenable, 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. 注: thenRealmnull になることはない。then.[[Callback]] が取り消された Proxy でコードが実行されない場合、thenRealm はエラーオブジェクト生成に用いられる。
  6. Record { [[Job]]: job, [[Realm]]: thenRealm } を返す。
Note

この Job は与えられた thenable とその then メソッドを利用して指定された Promise を解決する。この過程は、then メソッドの評価が周囲コードの評価完了後に行われることを保証するため、Job として実行されなければならない。

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

Promise コンストラクタ:

  • %Promise% である。
  • グローバルオブジェクト"Promise" プロパティの初期値である。
  • コンストラクタとして呼び出されたとき新しい Promise を生成し初期化する。
  • 関数として呼び出すことは意図されておらず、そのように呼び出された場合は例外を投げる。
  • クラス定義の extends 句における値として使用できる。指定された Promise の挙動を継承することを意図するサブクラスのコンストラクタは、Promise および Promise.prototype の組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを生成・初期化するため、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 引数は関数オブジェクトでなければならない。これはこの Promise が表す、遅延される可能性のある処理の開始と完了報告のために呼び出される。executor は 2 つの引数 resolvereject で呼び出される。これらは遅延計算の最終的な完了または失敗を報告するために executor が使用できる関数である。executor から復帰することは遅延処理が完了したことを意味せず、遅延処理を最終的に実行する要求が受理されたことのみを意味する。

executor に渡される resolve 関数は 1 つの引数を受け取る。executor コードは最終的に resolve を呼び、関連する Promise を解決したい意図を示すことができる。resolve に渡される引数は遅延処理の最終的な値を表し、実際の履行値か、履行された場合にその値を与える別の Promise のいずれかである。

executor に渡される reject 関数は 1 つの引数を受け取る。executor コードは最終的に reject を呼び、関連する Promise が拒否され決して履行されないことを示すことができる。reject に渡される引数は Promise の拒否理由として用いられ、典型的には Error オブジェクトである。

Promise コンストラクタexecutor に渡す resolve / reject 関数には、関連する Promise を実際に解決/拒否する能力がある。サブクラスは異なるコンストラクタ挙動を持ち、resolve と reject にカスタマイズされた値を渡す場合がある。

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

Promise コンストラクタ:

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

27.2.4.1 Promise.all ( iterable )

この関数は、渡された Promise 群について、その履行値の配列で履行される新しい Promise を返す。あるいは最初に拒否された Promise の理由で拒否される。実行中、渡された iterable の各要素を Promise に解決する。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. promiseResolveCompletion(GetPromiseResolve(C)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAll(iteratorRecord, C, promiseCapability, promiseResolve)) とする。
  8. もし resultabrupt completion なら
    1. もし iteratorRecord.[[Done]]false なら resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

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

27.2.4.1.1 GetPromiseResolve ( promiseConstructor )

The abstract operation GetPromiseResolve takes argument promiseConstructor (a constructor) and returns 正常完了で関数オブジェクトを含むか、または 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 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. values を新しい空 List とする。
  2. remainingElementsCountRecord { [[Value]]: 1 } とする。
  3. index を 0 とする。
  4. 繰り返す,
    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. stepsPromise.all Resolve 要素関数 (Promise.all Resolve Element Functions) で定義されるアルゴリズム手順とする。
    6. lengthPromise.all Resolve 要素関数 (Promise.all Resolve Element Functions) にある関数定義の省略不可パラメータ数とする。
    7. onFulfilledCreateBuiltinFunction(steps, length, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») とする。
    8. onFulfilled.[[AlreadyCalled]]false に設定する。
    9. onFulfilled.[[Index]]index に設定する。
    10. onFulfilled.[[Values]]values に設定する。
    11. onFulfilled.[[Capability]]resultCapability に設定する。
    12. onFulfilled.[[RemainingElements]]remainingElementsCount に設定する。
    13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    14. ? Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] ») を実行する。
    15. indexindex + 1 に設定する。

27.2.4.1.3 Promise.all Resolve 要素関数 (Promise.all Resolve Element Functions)

Promise.all Resolve 要素関数は特定の Promise.all の要素を解決するために使われる匿名組み込み関数である。各 Promise.all Resolve 要素関数は [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 内部スロットを持つ。

Promise.all Resolve 要素関数が引数 x で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. もし F.[[AlreadyCalled]]true なら undefined を返す。
  3. F.[[AlreadyCalled]]true に設定する。
  4. indexF.[[Index]] とする。
  5. valuesF.[[Values]] とする。
  6. promiseCapabilityF.[[Capability]] とする。
  7. remainingElementsCountF.[[RemainingElements]] とする。
  8. values[index] を x に設定する。
  9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
  10. もし remainingElementsCount.[[Value]] = 0 なら
    1. valuesArrayCreateArrayFromList(values) とする。
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す。
  11. undefined を返す。

Promise.all Resolve 要素関数の "length" プロパティは 1𝔽 である。

27.2.4.2 Promise.allSettled ( iterable )

この関数は、元のすべての Promise が確定(fulfilled か rejected)した後に、Promise 状態スナップショットの配列で履行される Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. promiseResolveCompletion(GetPromiseResolve(C)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAllSettled(iteratorRecord, C, promiseCapability, promiseResolve)) とする。
  8. もし resultabrupt completion なら
    1. もし iteratorRecord.[[Done]]false なら resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は this 値が 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 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. values を新しい空 List とする。
  2. remainingElementsCountRecord { [[Value]]: 1 } とする。
  3. index を 0 とする。
  4. 繰り返す,
    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. stepsFulfilledPromise.allSettled Resolve 要素関数 (Promise.allSettled Resolve Element Functions) で定義されるアルゴリズム手順とする。
    6. lengthFulfilledPromise.allSettled Resolve 要素関数 (Promise.allSettled Resolve Element Functions) にある関数定義の省略不可パラメータ数とする。
    7. onFulfilledCreateBuiltinFunction(stepsFulfilled, lengthFulfilled, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») とする。
    8. alreadyCalledRecord { [[Value]]: false } とする。
    9. onFulfilled.[[AlreadyCalled]]alreadyCalled に設定する。
    10. onFulfilled.[[Index]]index に設定する。
    11. onFulfilled.[[Values]]values に設定する。
    12. onFulfilled.[[Capability]]resultCapability に設定する。
    13. onFulfilled.[[RemainingElements]]remainingElementsCount に設定する。
    14. stepsRejectedPromise.allSettled Reject 要素関数 (Promise.allSettled Reject Element Functions) で定義されるアルゴリズム手順とする。
    15. lengthRejectedPromise.allSettled Reject 要素関数 (Promise.allSettled Reject Element Functions) にある関数定義の省略不可パラメータ数とする。
    16. onRejectedCreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») とする。
    17. onRejected.[[AlreadyCalled]]alreadyCalled に設定する。
    18. onRejected.[[Index]]index に設定する。
    19. onRejected.[[Values]]values に設定する。
    20. onRejected.[[Capability]]resultCapability に設定する。
    21. onRejected.[[RemainingElements]]remainingElementsCount に設定する。
    22. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    23. ? Invoke(nextPromise, "then", « onFulfilled, onRejected ») を実行する。
    24. indexindex + 1 に設定する。

27.2.4.2.2 Promise.allSettled Resolve 要素関数 (Promise.allSettled Resolve Element Functions)

Promise.allSettled Resolve 要素関数は特定の Promise.allSettled の要素を解決するために使われる匿名組み込み関数である。各 Promise.allSettled Resolve 要素関数は [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 内部スロットを持つ。

Promise.allSettled Resolve 要素関数が引数 x で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. alreadyCalledF.[[AlreadyCalled]] とする。
  3. もし alreadyCalled.[[Value]]true なら undefined を返す。
  4. alreadyCalled.[[Value]]true に設定する。
  5. indexF.[[Index]] とする。
  6. valuesF.[[Values]] とする。
  7. promiseCapabilityF.[[Capability]] とする。
  8. remainingElementsCountF.[[RemainingElements]] とする。
  9. objOrdinaryObjectCreate(%Object.prototype%) とする。
  10. CreateDataPropertyOrThrow(obj, "status", "fulfilled") を実行する。
  11. CreateDataPropertyOrThrow(obj, "value", x) を実行する。
  12. values[index] を obj に設定する。
  13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
  14. もし remainingElementsCount.[[Value]] = 0 なら
    1. valuesArrayCreateArrayFromList(values) とする。
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す。
  15. undefined を返す。

Promise.allSettled Resolve 要素関数の "length" プロパティは 1𝔽 である。

27.2.4.2.3 Promise.allSettled Reject 要素関数 (Promise.allSettled Reject Element Functions)

Promise.allSettled Reject 要素関数は特定の Promise.allSettled の要素を拒否させるために使われる匿名組み込み関数である。各 Promise.allSettled Reject 要素関数は [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 内部スロットを持つ。

Promise.allSettled Reject 要素関数が引数 x で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. alreadyCalledF.[[AlreadyCalled]] とする。
  3. もし alreadyCalled.[[Value]]true なら undefined を返す。
  4. alreadyCalled.[[Value]]true に設定する。
  5. indexF.[[Index]] とする。
  6. valuesF.[[Values]] とする。
  7. promiseCapabilityF.[[Capability]] とする。
  8. remainingElementsCountF.[[RemainingElements]] とする。
  9. objOrdinaryObjectCreate(%Object.prototype%) とする。
  10. CreateDataPropertyOrThrow(obj, "status", "rejected") を実行する。
  11. CreateDataPropertyOrThrow(obj, "reason", x) を実行する。
  12. values[index] を obj に設定する。
  13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
  14. もし remainingElementsCount.[[Value]] = 0 なら
    1. valuesArrayCreateArrayFromList(values) とする。
    2. ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») を返す。
  15. undefined を返す。

Promise.allSettled Reject 要素関数の "length" プロパティは 1𝔽 である。

27.2.4.3 Promise.any ( iterable )

この関数は、最初に fulfilled になった渡された Promise の値で履行されるか、すべてが拒否された場合には拒否理由を保持する AggregateError で拒否される Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. promiseResolveCompletion(GetPromiseResolve(C)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseAny(iteratorRecord, C, promiseCapability, promiseResolve)) とする。
  8. もし resultabrupt completion なら
    1. もし iteratorRecord.[[Done]]false なら resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note

この関数は this 値が 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 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. errors を新しい空 List とする。
  2. remainingElementsCountRecord { [[Value]]: 1 } とする。
  3. index を 0 とする。
  4. 繰り返す,
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. もし nextdone なら
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
      2. もし remainingElementsCount.[[Value]] = 0 なら
        1. error を新しく生成された AggregateError オブジェクトとする。
        2. DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) を実行する。
        3. Return ThrowCompletion(error)。
      3. resultCapability.[[Promise]] を返す。
    3. undefinederrors に追加する。
    4. nextPromise を ? Call(promiseResolve, constructor, « next ») とする。
    5. stepsRejectedPromise.any Reject 要素関数 (Promise.any Reject Element Functions) で定義されるアルゴリズム手順とする。
    6. lengthRejectedPromise.any Reject 要素関数 (Promise.any Reject Element Functions) にある関数定義の省略不可パラメータ数とする。
    7. onRejectedCreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Errors]], [[Capability]], [[RemainingElements]] ») とする。
    8. onRejected.[[AlreadyCalled]]false に設定する。
    9. onRejected.[[Index]]index に設定する。
    10. onRejected.[[Errors]]errors に設定する。
    11. onRejected.[[Capability]]resultCapability に設定する。
    12. onRejected.[[RemainingElements]]remainingElementsCount に設定する。
    13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1 に設定する。
    14. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected ») を実行する。
    15. indexindex + 1 に設定する。

27.2.4.3.2 Promise.any Reject 要素関数 (Promise.any Reject Element Functions)

Promise.any Reject 要素関数は特定の Promise.any 要素を拒否するために使われる匿名組み込み関数である。各 Promise.any Reject 要素関数は [[Index]], [[Errors]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 内部スロットを持つ。

Promise.any Reject 要素関数が引数 x で呼ばれたとき、次を行う:

  1. F をアクティブな関数オブジェクトとする。
  2. もし F.[[AlreadyCalled]]true なら undefined を返す。
  3. F.[[AlreadyCalled]]true に設定する。
  4. indexF.[[Index]] とする。
  5. errorsF.[[Errors]] とする。
  6. promiseCapabilityF.[[Capability]] とする。
  7. remainingElementsCountF.[[RemainingElements]] とする。
  8. errors[index] を x に設定する。
  9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1 に設定する。
  10. もし remainingElementsCount.[[Value]] = 0 なら
    1. error を新しく生成された AggregateError オブジェクトとする。
    2. DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) }) を実行する。
    3. ? Call(promiseCapability.[[Reject]], undefined, « error ») を返す。
  11. undefined を返す。

Promise.any Reject 要素関数の "length" プロパティは 1𝔽 である。

27.2.4.4 Promise.prototype

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

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

27.2.4.5 Promise.race ( iterable )

この関数は、渡された Promise 群のうち最初に確定したものと同じ方法で確定する新しい Promise を返す。実行中、渡された iterable の各要素を Promise に解決する。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. promiseResolveCompletion(GetPromiseResolve(C)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecordCompletion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. resultCompletion(PerformPromiseRace(iteratorRecord, C, promiseCapability, promiseResolve)) とする。
  8. もし resultabrupt completion なら
    1. もし iteratorRecord.[[Done]]false なら resultCompletion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. result を返す。
Note 1

iterable 引数が値を一切生成しないか、生成された Promise がいずれも確定しない場合、このメソッドが返す pending 状態の Promise は確定しないままである。

Note 2

この関数は this 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であり、かつ this 値が 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 正常完了で ECMAScript 言語値を含むか、または 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 ( r )

この関数は渡された引数で拒否された新しい Promise を返す。

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

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

27.2.4.7 Promise.resolve ( x )

この関数は、引数がこのコンストラクタによって生成された Promise であればその引数自体を、そうでなければ引数で解決された新しい Promise を返す。

  1. Cthis 値とする。
  2. もし C が Object でなければ TypeError 例外を投げる。
  3. PromiseResolve(C, x) を返す。
Note

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

27.2.4.7.1 PromiseResolve ( C, x )

The abstract operation PromiseResolve takes arguments C (an Object) and x (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. x で解決された新しい Promise を返す。 It performs the following steps when called:

  1. もし IsPromise(x) が true なら
    1. xConstructor を ? Get(x, "constructor") とする。
    2. もし SameValue(xConstructor, C) が true なら x を返す。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  3. ? Call(promiseCapability.[[Resolve]], undefined, « x ») を実行する。
  4. promiseCapability.[[Promise]] を返す。

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

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

  1. Cthis 値とする。
  2. もし C が Object でなければ TypeError 例外を投げる。
  3. promiseCapability を ? NewPromiseCapability(C) とする。
  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 値が Promise コンストラクタのパラメータ規約をサポートするコンストラクタ関数であることを期待する。

27.2.4.9 Promise.withResolvers ( )

この関数は 3 つのプロパティ(新しい Promise とそれに結び付けられた resolve / reject 関数)を持つオブジェクトを返す。

  1. Cthis 値とする。
  2. promiseCapability を ? NewPromiseCapability(C) とする。
  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 アクセサ関数が undefined であるアクセサプロパティであり、get アクセサ関数は呼び出されると次の手順を実行する:

  1. this 値を返す。

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

Note

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

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

Promise プロトタイプオブジェクト は次の通り:

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

27.2.5.1 Promise.prototype.catch ( onRejected )

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

  1. promisethis 値とする。
  2. Return ? 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 値とする。
  2. もし promise が Object でなければ TypeError 例外を投げる。
  3. C を ? SpeciesConstructor(promise, %Promise%) とする。
  4. 事前条件: IsConstructor(C) は true である。
  5. もし IsCallable(onFinally) が false なら
    1. thenFinallyonFinally とする。
    2. catchFinallyonFinally とする。
  6. それ以外
    1. thenFinallyClosure をパラメータ (value) を取り onFinallyC を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(C, result) とする。
      3. returnValue を引数なしで value を捕捉し呼び出されると次を行う新たな Abstract Closure とし、NormalCompletion(value) を返す。
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « ») とする。
      5. Return ? Invoke(p, "then", « valueThunk »).
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « ») とする。
    3. catchFinallyClosure をパラメータ (reason) を取り onFinallyC を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(C, result) とする。
      3. throwReason を引数なしで reason を捕捉し呼び出されると次を行う新たな Abstract Closure とし、Return ThrowCompletion(reason)。
      4. throwerCreateBuiltinFunction(throwReason, 0, "", « ») とする。
      5. Return ? Invoke(p, "then", « thrower »).
    4. catchFinallyCreateBuiltinFunction(catchFinallyClosure, 1, "", « ») とする。
  7. Return ? Invoke(promise, "then", « thenFinally, catchFinally »).

27.2.5.4 Promise.prototype.then ( onFulfilled, onRejected )

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

  1. promisethis 値とする。
  2. もし IsPromise(promise) が false なら TypeError 例外を投げる。
  3. C を ? SpeciesConstructor(promise, %Promise%) とする。
  4. resultCapability を ? NewPromiseCapability(C) とする。
  5. Return 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 ECMAScript language value. promise に対し onFulfilledonRejected を確定時アクションとして “then” 操作を行う。resultCapability が渡された場合、その Promise を更新して結果を格納する。渡されない場合、結果を不要とする仕様内部操作による呼び出しである。 It performs the following steps when called:

  1. 事前条件: 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. 事前条件: 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 なら
    1. undefined を返す。
  14. それ以外
    1. resultCapability.[[Promise]] を返す。

27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]

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

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

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

Promise インスタンスは(組み込み %Promise.prototype% である)Promise プロトタイプオブジェクトからプロパティを継承する通常のオブジェクトである。Promise インスタンスは Table 90 に記述される内部スロットを持って初期化される。

Table 90: Promise インスタンスの内部スロット
Internal Slot Type Description
[[PromiseState]] pending, fulfilled, or rejected その then メソッドへの呼び出しに対し Promise がどのように反応するかを制御する。
[[PromiseResult]] ECMAScript 言語値または empty Promise が履行または拒否された値(存在する場合)。empty[[PromiseState]]pending の場合に限り設定される。
[[PromiseFulfillReactions]] PromiseReaction RecordList pending から fulfilled への遷移時(または遷移した場合)に処理されるレコード。
[[PromiseRejectReactions]] PromiseReaction RecordList pending から rejected への遷移時(または遷移した場合)に処理されるレコード。
[[PromiseIsHandled]] Boolean 一度でも履行または拒否ハンドラを持ったことがあるかを示す;未処理拒否の追跡に使用される。

27.3 GeneratorFunction オブジェクト

GeneratorFunction は、通常 GeneratorDeclarationGeneratorExpressionGeneratorMethod を評価することで生成される関数である。また %GeneratorFunction% 組込みを呼び出すことでも生成され得る。

Figure 6 (Informative): Generator オブジェクトの関係
無数のボックスと矢印。

27.3.1 GeneratorFunction コンストラクタ

GeneratorFunction コンストラクタ:

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

27.3.1.1 GeneratorFunction ( ...parameterArgs, bodyArg )

最後の引数(もしあれば)がジェネレータ関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。

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

  1. C をアクティブな関数オブジェクトとする。
  2. もし bodyArg が存在しなければ bodyArg を空文字列に設定する。
  3. CreateDynamicFunction(C, NewTarget, generator, parameterArgs, bodyArg) を返す。
Note

20.2.1.1 の注を参照。

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

GeneratorFunction コンストラクタ:

  • Function コンストラクタを継承する標準組込み関数オブジェクトである。
  • [[Prototype]] 内部スロットの値は %Function% である。
  • "length" プロパティを持ち、その値は 1𝔽 である。
  • "name" プロパティを持ち、その値は "GeneratorFunction" である。
  • 次のプロパティを持つ:

27.3.2.1 GeneratorFunction.prototype

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

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

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

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

  • %GeneratorFunction.prototype% である (Figure 6 を参照)。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、Table 28 または Table 91 に列挙される [[ECMAScriptCode]] 内部スロットやその他の内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Function.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% プロパティの初期値は文字列値 "GeneratorFunction" である。

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

27.3.4 GeneratorFunction インスタンス

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

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

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 インスタンスが生成されるたびに別の通常オブジェクトも生成され、そのジェネレータ関数の "prototype" プロパティの初期値となる。prototype プロパティの値は、そのジェネレータ関数オブジェクト[[Call]] を用いて呼び出されたとき、新たに生成される Generator の [[Prototype]] 内部スロットを初期化するために用いられる。

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

Note

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

27.4 AsyncGeneratorFunction オブジェクト

AsyncGeneratorFunction は、通常 AsyncGeneratorDeclaration, AsyncGeneratorExpression, AsyncGeneratorMethod の構文生成物を評価することで生成される関数である。また %AsyncGeneratorFunction% 組込みを呼び出すことでも生成され得る。

27.4.1 AsyncGeneratorFunction コンストラクタ

AsyncGeneratorFunction コンストラクタ:

  • %AsyncGeneratorFunction% である。
  • Function のサブクラスである。
  • コンストラクタとしてではなく関数として呼び出されたとき、新しい AsyncGeneratorFunction を生成し初期化する。したがって関数呼び出し AsyncGeneratorFunction (...) は同じ引数でのオブジェクト生成式 new AsyncGeneratorFunction (...) と同等である。
  • クラス定義の extends 句の値として使用できる。指定された AsyncGeneratorFunction の挙動を継承することを意図するサブクラスのコンストラクタは、組込み AsyncGeneratorFunction の挙動に必要な内部スロットを持つサブクラスインスタンスを生成・初期化するため、AsyncGeneratorFunction コンストラクタへの super 呼び出しを含めなければならない。非同期ジェネレータ関数オブジェクトを定義する全ての ECMAScript 構文形式は AsyncGeneratorFunction の直接インスタンスを生成する。AsyncGeneratorFunction サブクラスのインスタンスを構文的に生成する手段は存在しない。

27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs, bodyArg )

最後の引数(もしあれば)が非同期ジェネレータ関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。

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

  1. C をアクティブな関数オブジェクトとする。
  2. もし bodyArg が存在しなければ bodyArg を空文字列に設定する。
  3. CreateDynamicFunction(C, NewTarget, async-generator, parameterArgs, bodyArg) を返す。
Note

20.2.1.1 の注を参照。

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

AsyncGeneratorFunction コンストラクタ:

  • Function コンストラクタを継承する標準組込み関数オブジェクトである。
  • [[Prototype]] 内部スロットの値は %Function% である。
  • "length" プロパティを持ち、その値は 1𝔽 である。
  • "name" プロパティを持ち、その値は "AsyncGeneratorFunction" である。
  • 次のプロパティを持つ:

27.4.2.1 AsyncGeneratorFunction.prototype

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

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

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

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

  • %AsyncGeneratorFunction.prototype% である。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、Table 28 または Table 92 に列挙される [[ECMAScriptCode]] 内部スロットやその他の内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Function.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% プロパティの初期値は文字列値 "AsyncGeneratorFunction" である。

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

27.4.4 AsyncGeneratorFunction インスタンス

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

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

27.4.4.1 length

"length" プロパティの値は、その AsyncGeneratorFunction が典型的に期待する引数の数を示す整数 Number である。ただし言語仕様上、他の数の引数で呼び出すことも許される。"length" プロパティで指定された数以外の引数個数で呼び出された際の動作はその関数に依存する。

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

27.4.4.2 name

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

27.4.4.3 prototype

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

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

Note

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

27.5 Generator オブジェクト

Generator はジェネレータ関数を呼び出すことで生成され、イテレータインタフェースおよび iterable インタフェースの双方に適合する。

Generator インスタンスは、それを生成したジェネレータ関数の "prototype" プロパティ初期値から直接プロパティを継承する。Generator インスタンスは間接的に %GeneratorPrototype% からプロパティを継承する。

27.5.1 %GeneratorPrototype% オブジェクト

%GeneratorPrototype% オブジェクト:

  • %GeneratorFunction.prototype.prototype% である。
  • 通常のオブジェクトである。
  • Generator インスタンスではなく、[[GeneratorState]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Iterator.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. gthis 値とする。
  2. CReturnCompletion(value) とする。
  3. GeneratorResumeAbrupt(g, C, empty) を返す。

27.5.1.4 %GeneratorPrototype%.throw ( exception )

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

  1. gthis 値とする。
  2. CThrowCompletion(exception) とする。
  3. GeneratorResumeAbrupt(g, C, empty) を返す。

27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

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

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

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

Generator インスタンスは Table 91 に記述される内部スロットを持って初期化される。

Table 91: Generator インスタンスの内部スロット
Internal Slot Type Description
[[GeneratorState]] suspended-start, suspended-yield, executing, or completed ジェネレータの現在の実行状態。
[[GeneratorContext]] 実行コンテキスト このジェネレータのコードを実行する際に使用される実行コンテキスト。
[[GeneratorBrand]] 文字列または empty 異なる種類のジェネレータを区別するために使用されるブランド。ECMAScript ソーステキストで宣言されたジェネレータの [[GeneratorBrand]] は常に empty である。

27.5.3 Generator 抽象操作

27.5.3.1 GeneratorStart ( generator, generatorBody )

The abstract operation GeneratorStart takes arguments generator (a Generator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

  1. 事前条件: generator.[[GeneratorState]]suspended-start である。
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator コンポーネントを generator に設定する。
  4. closure を、引数なしで generatorBody を捕捉し、呼び出されると次を行う新たな Abstract Closure とする:
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGeneratoracGenContext の Generator コンポーネントとする。
    3. もし generatorBody が Parse Node なら
      1. resultCompletion(Evaluation of generatorBody) とする。
    4. それ以外
      1. 事前条件: generatorBody は引数なしの Abstract Closure である。
      2. resultCompletion(generatorBody()) とする。
    5. 事前条件: ここに戻ってきたとき、ジェネレータは例外を投げたか、暗黙または明示の return を実行している。
    6. acGenContext を実行コンテキストスタックから除去し、スタックトップの実行コンテキストを実行中の実行コンテキストとして復元する。
    7. acGenerator.[[GeneratorState]]completed に設定する。
    8. 注: ジェネレータが completed 状態に入ると二度と離れず、その関連実行コンテキストが再開されることはない。acGenerator に関連する任意の実行状態はこの時点で破棄可能。
    9. もし resultnormal completion なら
      1. resultValueundefined とする。
    10. それ以外で resultreturn completion なら
      1. resultValueresult.[[Value]] とする。
    11. それ以外
      1. 事前条件: 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 (an ECMAScript language value) and generatorBrand (a String or empty) and returns 正常完了で suspended-start, suspended-yield, completed のいずれかを含むか、または throw completion. It performs the following steps when called:

  1. RequireInternalSlot(generator, [[GeneratorState]]) を実行する。
  2. RequireInternalSlot(generator, [[GeneratorBrand]]) を実行する。
  3. もし generator.[[GeneratorBrand]]generatorBrand でなければ TypeError 例外を投げる。
  4. 事前条件: 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 (an ECMAScript language value), value (an ECMAScript language value or empty), and generatorBrand (a String or empty) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. state を ? GeneratorValidate(generator, generatorBrand) とする。
  2. もし statecompleted なら CreateIteratorResultObject(undefined, true) を返す。
  3. 事前条件: statesuspended-start または suspended-yield のいずれか。
  4. genContextgenerator.[[GeneratorContext]] とする。
  5. methodContext を実行中の実行コンテキストとする。
  6. methodContext をサスペンドする。
  7. generator.[[GeneratorState]]executing に設定する。
  8. genContext を実行コンテキストスタックにプッシュし、genContext を実行中の実行コンテキストとする。
  9. genContext のサスペンドされた評価を再開し、サスペンドを発生させた操作の結果として NormalCompletion(value) を用いる。result を再開された計算により返された値とする。
  10. 事前条件: ここに戻るとき、genContext はすでに実行コンテキストスタックから除去され、methodContext が現在の実行中の実行コンテキストである。
  11. result を返す。

27.5.3.4 GeneratorResumeAbrupt ( generator, abruptCompletion, generatorBrand )

The abstract operation GeneratorResumeAbrupt takes arguments generator (an ECMAScript language value), abruptCompletion (a return completion or a throw completion), and generatorBrand (a String or empty) and returns 正常完了で ECMAScript 言語値を含むか、または throw completion. It performs the following steps when called:

  1. state を ? GeneratorValidate(generator, generatorBrand) とする。
  2. もし statesuspended-start なら
    1. generator.[[GeneratorState]]completed に設定する。
    2. 注: ジェネレータが completed 状態に入ると二度と離れず、その関連実行コンテキストが再開されることはない。generator に関連する任意の実行状態はこの時点で破棄可能。
    3. statecompleted に設定する。
  3. もし statecompleted なら
    1. もし abruptCompletionreturn completion なら
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true) を返す。
    2. abruptCompletion を返す。
  4. 事前条件: statesuspended-yield である。
  5. genContextgenerator.[[GeneratorContext]] とする。
  6. methodContext を実行中の実行コンテキストとする。
  7. methodContext をサスペンドする。
  8. generator.[[GeneratorState]]executing に設定する。
  9. genContext を実行コンテキストスタックにプッシュし、genContext を実行中の実行コンテキストとする。
  10. genContext のサスペンドされた評価を再開し、サスペンドを発生させた操作の結果として abruptCompletion を用いる。result を再開された計算により返された Completion Record とする。
  11. 事前条件: ここに戻るとき、genContext はすでに実行コンテキストスタックから除去され、methodContext が現在の実行中の実行コンテキストである。
  12. result を返す。

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 (an Object that conforms to the IteratorResult interface) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion. It performs the following steps when called:

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

27.5.3.7 Yield ( value )

The abstract operation Yield takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または 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 (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and optional argument extraSlots (a List of names of internal slots) and returns a Generator. It performs the following steps when called:

  1. 注: 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 がまだサスペンドされていなければ callerContext をサスペンドする。
  13. calleeContext を実行コンテキストスタックにプッシュし、calleeContext を実行中の実行コンテキストとする。
  14. GeneratorStart(generator, closure) を実行する。
  15. calleeContext を実行コンテキストスタックから除去し、callerContext を実行中の実行コンテキストとして復元する。
  16. generator を返す。

27.6 AsyncGenerator オブジェクト

AsyncGenerator は非同期ジェネレータ関数を呼び出すことで生成され、非同期イテレータインタフェースおよび非同期 iterable インタフェースの双方に適合する。

AsyncGenerator インスタンスは、それを生成した非同期ジェネレータ関数の "prototype" プロパティ初期値から直接プロパティを継承し、間接的に %AsyncGeneratorPrototype% からプロパティを継承する。

27.6.1 %AsyncGeneratorPrototype% オブジェクト

%AsyncGeneratorPrototype% オブジェクト:

  • %AsyncGeneratorFunction.prototype.prototype% である。
  • 通常のオブジェクトである。
  • AsyncGenerator インスタンスではなく、[[AsyncGeneratorState]] 内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %AsyncIteratorPrototype% である。
  • すべての 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 値とする。
  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. 事前条件: stateexecuting または draining-queue のいずれか。
  11. promiseCapability.[[Promise]] を返す。

27.6.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. generatorthis 値とする。
  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. 事前条件: stateexecuting または draining-queue のいずれか。
  11. promiseCapability.[[Promise]] を返す。

27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. generatorthis 値とする。
  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. 事前条件: stateexecuting または draining-queue のいずれか。
  12. promiseCapability.[[Promise]] を返す。

27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

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

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

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

AsyncGenerator インスタンスは初期化時に以下の内部スロットを持つ:

Table 92: AsyncGenerator インスタンスの内部スロット
Internal Slot Type Description
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, or completed 非同期ジェネレータの現在の実行状態。
[[AsyncGeneratorContext]] an execution context この非同期ジェネレータのコードを実行する際に用いる実行コンテキスト。
[[AsyncGeneratorQueue]] a List of AsyncGeneratorRequest Records 非同期ジェネレータ再開要求を表すレコード。状態遷移中を除き、[[AsyncGeneratorState]]executing または draining-queue の場合に限り非空。
[[GeneratorBrand]] a String or empty 異なる種類の非同期ジェネレータを識別するブランド。ECMAScript ソースで宣言されたものの [[GeneratorBrand]] は常に empty

27.6.3 AsyncGenerator 抽象操作

27.6.3.1 AsyncGeneratorRequest レコード

AsyncGeneratorRequest は、非同期ジェネレータをどのように再開すべきかの情報を保持し、対応する promise を履行または拒否するためのケイパビリティを含む Record 値である。

以下のフィールドを持つ:

Table 93: AsyncGeneratorRequest Record フィールド
Field Name Value Meaning
[[Completion]] a Completion Record 非同期ジェネレータを再開する際に使用すべき Completion Record
[[Capability]] a PromiseCapability Record この要求に関連付けられた promise ケイパビリティ。

27.6.3.2 AsyncGeneratorStart ( generator, generatorBody )

The abstract operation AsyncGeneratorStart takes arguments generator (an AsyncGenerator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

  1. 事前条件: generator.[[AsyncGeneratorState]]suspended-start
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator コンポーネントを generator に設定する。
  4. closure を、引数なしで generatorBody を捕捉し、呼び出されると次を行う新たな Abstract Closure とする:
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGeneratoracGenContext の Generator コンポーネントとする。
    3. もし generatorBody が Parse Node なら
      1. resultCompletion(Evaluation of generatorBody) とする。
    4. それ以外
      1. 事前条件: generatorBody は引数なしの Abstract Closure
      2. resultCompletion(generatorBody()) とする。
    5. 事前条件: ここに戻るとき、非同期ジェネレータは例外送出または暗黙/明示の 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 (an ECMAScript language value) and generatorBrand (a String or empty) and returns 正常完了で unused を含むか、または 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 (an AsyncGenerator), completion (a Completion Record), and promiseCapability (a 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 (an AsyncGenerator), completion (a Completion Record), and done (a Boolean) and optional argument realm (a Realm Record) and returns unused. It performs the following steps when called:

  1. 事前条件: 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. 事前条件: 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 (an AsyncGenerator) and completion (a Completion Record) and returns unused. It performs the following steps when called:

  1. 事前条件: generator.[[AsyncGeneratorState]]suspended-startsuspended-yield のいずれか。
  2. genContextgenerator.[[AsyncGeneratorContext]] とする。
  3. callerContext を実行中の実行コンテキストとする。
  4. callerContext をサスペンドする。
  5. generator.[[AsyncGeneratorState]]executing に設定する。
  6. genContext を実行コンテキストスタックにプッシュし、実行中の実行コンテキストとする。
  7. genContext のサスペンドされた評価を再開し、サスペンドを引き起こした操作の結果として completion を用いる。result を再開計算が返す Completion Record とする。
  8. 事前条件: resultabrupt completion にはならない。
  9. 事前条件: ここに戻るとき genContext はスタックから除去され、callerContext が実行中。
  10. unused を返す。

27.6.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (a Completion Record) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion. It performs the following steps when called:

  1. もし resumptionValuereturn completion でなければ ? resumptionValue を返す。
  2. awaitedCompletion(Await(resumptionValue.[[Value]])) とする。
  3. もし awaitedthrow completion なら ? awaited を返す。
  4. 事前条件: awaitednormal completion
  5. Return ReturnCompletion(awaited.[[Value]])。

27.6.3.8 AsyncGeneratorYield ( value )

The abstract operation AsyncGeneratorYield takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値を含むか、または abrupt completion. It performs the following steps when called:

  1. genContext を実行中の実行コンテキストとする。
  2. 事前条件: genContext はジェネレータの実行コンテキスト。
  3. generatorgenContext の Generator コンポーネントの値とする。
  4. 事前条件: GetGeneratorKind() は async
  5. completionNormalCompletion(value) とする。
  6. 事前条件: 実行コンテキストスタックは少なくとも 2 要素を持つ。
  7. previousContext をスタック二番目の要素とする。
  8. previousRealmpreviousContextRealm とする。
  9. AsyncGeneratorCompleteStep(generator, completion, false, previousRealm) を実行する。
  10. queuegenerator.[[AsyncGeneratorQueue]] とする。
  11. もし queue が空でないなら
    1. 注: ジェネレータをサスペンドせず実行継続。
    2. toYieldqueue の先頭要素とする。
    3. resumptionValueCompletion(toYield.[[Completion]]) とする。
    4. AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。
  12. それ以外
    1. generator.[[AsyncGeneratorState]]suspended-yield に設定する。
    2. genContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元する。
    3. callerContext を実行中の実行コンテキストとする。
    4. callerContextundefined を渡して再開する。もし genContext が再度再開されるなら resumptionValue をその Completion Record とする。
    5. 事前条件: ここに到達したとき genContext が再び実行中。
    6. AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。

27.6.3.9 AsyncGeneratorAwaitReturn ( generator )

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

  1. 事前条件: generator.[[AsyncGeneratorState]]draining-queue
  2. queuegenerator.[[AsyncGeneratorQueue]] とする。
  3. 事前条件: queue は空でない。
  4. nextqueue の先頭要素とする。
  5. completionCompletion(next.[[Completion]]) とする。
  6. 事前条件: completionreturn completion
  7. promiseCompletionCompletion(PromiseResolve(%Promise%, completion.[[Value]])) とする。
  8. もし promiseCompletionabrupt completion なら
    1. AsyncGeneratorCompleteStep(generator, promiseCompletion, true) を実行。
    2. AsyncGeneratorDrainQueue(generator) を実行。
    3. unused を返す。
  9. 事前条件: promiseCompletionnormal completion
  10. promisepromiseCompletion.[[Value]] とする。
  11. fulfilledClosure をパラメータ (value) を取り generator を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. 事前条件: generator.[[AsyncGeneratorState]]draining-queue
    2. resultNormalCompletion(value) とする。
    3. AsyncGeneratorCompleteStep(generator, result, true) を実行。
    4. AsyncGeneratorDrainQueue(generator) を実行。
    5. NormalCompletion(undefined) を返す。
  12. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  13. rejectedClosure をパラメータ (reason) を取り generator を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. 事前条件: 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 (an AsyncGenerator) and returns unused. AsyncGeneratorQueue を、return completion を保持する AsyncGeneratorRequest に遭遇するまで処理する。 It performs the following steps when called:

  1. 事前条件: generator.[[AsyncGeneratorState]]draining-queue
  2. queuegenerator.[[AsyncGeneratorQueue]] とする。
  3. queue が空でない間繰り返す,
    1. nextqueue の先頭要素とする。
    2. completionCompletion(next.[[Completion]]) とする。
    3. もし completionreturn completion なら
      1. AsyncGeneratorAwaitReturn(generator) を実行。
      2. unused を返す。
    4. それ以外
      1. もし completionnormal completion なら
        1. completionNormalCompletion(undefined) に設定。
      2. AsyncGeneratorCompleteStep(generator, completion, true) を実行。
  4. generator.[[AsyncGeneratorState]]completed に設定。
  5. unused を返す。

27.6.3.11 CreateAsyncIteratorFromClosure ( closure, generatorBrand, generatorPrototype )

The abstract operation CreateAsyncIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and returns an AsyncGenerator. It performs the following steps when called:

  1. 注: closureAwait 操作および IteratorResult オブジェクトを yield するための Yield 操作を含み得る。
  2. internalSlotsList を « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] » とする。
  3. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList) とする。
  4. generator.[[GeneratorBrand]]generatorBrand に設定する。
  5. generator.[[AsyncGeneratorState]]suspended-start に設定する。
  6. callerContext を実行中の実行コンテキストとする。
  7. calleeContext を新しい実行コンテキストとする。
  8. calleeContext の Function を null に設定する。
  9. calleeContextRealm を現在の Realm Record に設定する。
  10. calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。
  11. もし callerContext がまだサスペンドされていなければ callerContext をサスペンドする。
  12. calleeContext を実行コンテキストスタックにプッシュし、実行中の実行コンテキストとする。
  13. AsyncGeneratorStart(generator, closure) を実行する。
  14. calleeContext を実行コンテキストスタックから除去し、callerContext を実行中として復元する。
  15. generator を返す。

27.7 AsyncFunction オブジェクト

AsyncFunction は通常 AsyncFunctionDeclarationAsyncFunctionExpressionAsyncMethodAsyncArrowFunction を評価することで生成される。%AsyncFunction% 組込みを呼び出すことでも生成され得る。

27.7.1 AsyncFunction コンストラクタ

AsyncFunction コンストラクタ:

  • %AsyncFunction% である。
  • Function のサブクラスである。
  • コンストラクタではなく関数として呼び出されたとき新しい AsyncFunction を生成し初期化する。したがって関数呼び出し AsyncFunction(…) は同じ引数での new AsyncFunction(…) と同等。
  • クラス定義の extends 句の値として使用できる。指定された AsyncFunction の挙動を継承するサブクラスコンストラクタは、組込み非同期関数挙動に必要な内部スロットを備えたサブクラスインスタンスを生成・初期化するため AsyncFunction コンストラクタへの super 呼び出しを含めなければならない。非同期関数オブジェクトを定義する全ての構文形式は AsyncFunction の直接インスタンスを生成する。AsyncFunction サブクラスインスタンスを構文的に生成する手段はない。

27.7.1.1 AsyncFunction ( ...parameterArgs, bodyArg )

最後の引数(存在する場合)が非同期関数の本体(実行コード)を指定し、それ以前の引数が仮引数を指定する。

この関数は呼び出されると次を実行する:

  1. C をアクティブな関数オブジェクトとする。
  2. もし bodyArg が存在しなければ bodyArg を空文字列に設定する。
  3. CreateDynamicFunction(C, NewTarget, async, parameterArgs, bodyArg) を返す。
Note
20.2.1.1 の注参照。

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

AsyncFunction コンストラクタ:

  • Function コンストラクタを継承する標準組込み関数オブジェクトである。
  • [[Prototype]] 内部スロットの値は %Function% である。
  • "length" プロパティを持ち、その値は 1𝔽 である。
  • "name" プロパティを持ち、その値は "AsyncFunction" である。
  • 次のプロパティを持つ:

27.7.2.1 AsyncFunction.prototype

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

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

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

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

  • %AsyncFunction.prototype% である。
  • 通常のオブジェクトである。
  • 関数オブジェクトではなく、Table 28 に列挙される [[ECMAScriptCode]] 内部スロットや他の内部スロットを持たない。
  • [[Prototype]] 内部スロットの値は %Function.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% プロパティの初期値は文字列値 "AsyncFunction" である。

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

27.7.4 AsyncFunction インスタンス

すべての AsyncFunction インスタンスは ECMAScript 関数オブジェクトであり、Table 28 に列挙される内部スロットを持つ。これらのインスタンスの [[IsClassConstructor]] 内部スロット値は false。AsyncFunction インスタンスはコンストラクタではなく [[Construct]] 内部メソッドを持たない。また構築不可能であるため prototype プロパティを持たない。

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

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 Function 抽象操作

27.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody )

The abstract operation AsyncFunctionStart takes arguments promiseCapability (a PromiseCapability Record) and asyncFunctionBody (a FunctionBody Parse Node, an ExpressionBody Parse Node, or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:

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

27.7.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

The abstract operation AsyncBlockStart takes arguments promiseCapability (a PromiseCapability Record), asyncBody (a Parse Node or an Abstract Closure with no parameters), and asyncContext (an execution context) and returns unused. It performs the following steps when called:

  1. runningContext を実行中の実行コンテキストとする。
  2. closure を、引数なしで promiseCapabilityasyncBody を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. acAsyncContext を実行中の実行コンテキストとする。
    2. もし asyncBody が Parse Node なら
      1. resultCompletion(Evaluation of asyncBody) とする。
    3. それ以外
      1. 事前条件: asyncBody は引数なしの Abstract Closure
      2. resultCompletion(asyncBody()) とする。
    4. 事前条件: ここに戻るとき非同期関数は例外送出か暗黙/明示の return を行っており、全ての await は完了。
    5. acAsyncContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元。
    6. もし resultnormal completion なら
      1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行。
    7. それ以外で resultreturn completion なら
      1. Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] ») を実行。
    8. それ以外
      1. 事前条件: resultthrow completion
      2. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») を実行。
    9. NormalCompletion(unused) を返す。
  3. asyncContext のコード評価状態を、再開時に引数なしで closure が呼ばれるよう設定。
  4. asyncContext を実行コンテキストスタックにプッシュし実行中とする。
  5. asyncContext のサスペンドされた評価を再開result を再開計算が返した値とする。
  6. 事前条件: ここに戻るとき asyncContext はスタックから除去され runningContext が実行中。
  7. 事前条件: result は値 unused を持つ normal completion。値の起源は Await か(await が無い場合)上記 2.i
  8. unused を返す。

27.7.5.3 Await ( value )

The abstract operation Await takes argument value (an ECMAScript language value) and returns 正常完了で ECMAScript 言語値または empty を含むか、または throw completion. It performs the following steps when called:

  1. asyncContext を実行中の実行コンテキストとする。
  2. promise を ? PromiseResolve(%Promise%, value) とする。
  3. fulfilledClosure をパラメータ (v) を取り asyncContext を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. prevContext を実行中の実行コンテキストとする。
    2. prevContext をサスペンドする。
    3. asyncContext を実行コンテキストスタックにプッシュし実行中とする。
    4. asyncContext のサスペンドされた評価を再開し、サスペンドを発生させた操作の結果として NormalCompletion(v) を用いる。
    5. 事前条件: この段階で asyncContext はスタックから除去され prevContext が実行中。
    6. NormalCompletion(undefined) を返す。
  4. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  5. rejectedClosure をパラメータ (reason) を取り asyncContext を捕捉し呼び出されると次を行う新たな Abstract Closure とする:
    1. prevContext を実行中の実行コンテキストとする。
    2. prevContext をサスペンドする。
    3. asyncContext を実行コンテキストスタックにプッシュし実行中とする。
    4. asyncContext のサスペンドされた評価を再開し、サスペンドを発生させた操作の結果として ThrowCompletion(reason) を用いる。
    5. 事前条件: この段階で asyncContext はスタックから除去され prevContext が実行中。
    6. NormalCompletion(undefined) を返す。
  6. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  7. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  8. asyncContext を実行コンテキストスタックから除去し、頂上の実行コンテキストを実行中として復元する。
  9. callerContext を実行中の実行コンテキストとする。
  10. callerContextempty を渡して再開する。もし asyncContext が再度再開されるなら completion をその Completion Record とする。
  11. 事前条件: ここに到達したとき asyncContext が再び実行中。
  12. completion を返す。