ページ表示設定

27 制御抽象化オブジェクト

27.1 反復

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

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

27.1.1.1 Iterable インターフェイス

iterable インターフェイスには、表 79 で説明されるプロパティが含まれます。

表 79: Iterable インターフェイスの必須プロパティ
プロパティ 値 要件
%Symbol.iterator% an iterator object を返す関数 返されるオブジェクトは iterator インターフェイスに適合しなければなりません。

27.1.1.2 Iterator インターフェイス

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

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

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

表 81: Iterator インターフェイスの省略可能なプロパティ
プロパティ 値 要件
"return" an IteratorResult object を返す関数 返されるオブジェクトは IteratorResult インターフェイスに適合しなければなりません。このメソッドを呼び出すと、呼出し元が iterator に対してこれ以上 next メソッドを呼び出す意図がないことを iterator オブジェクトへ通知します。返される IteratorResult オブジェクトは通常、値が true である "done" プロパティと、return メソッドの引数として渡された値を持つ "value" プロパティを持ちます。ただし、この要件は強制されません。
"throw" an IteratorResult object を返す関数 返されるオブジェクトは IteratorResult インターフェイスに適合しなければなりません。このメソッドを呼び出すと、呼出し元がエラー状態を検出したことを iterator オブジェクトへ通知します。引数はエラー状態を識別するために使用でき、通常は例外オブジェクトです。典型的な応答は、引数として渡された値を throw することです。メソッドが throw しない場合、返される IteratorResult オブジェクトは通常、値が true である "done" プロパティを持ちます。
注 2

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

27.1.1.3 Async Iterable インターフェイス

async iterable インターフェイスには、表 82 で説明されるプロパティが含まれます。

表 82: Async Iterable インターフェイスの必須プロパティ
プロパティ 値 要件
%Symbol.asyncIterator% an async iterator object を返す関数 返されるオブジェクトは async iterator インターフェイスに適合しなければなりません。

27.1.1.4 Async Iterator インターフェイス

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

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

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

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

注 1

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

表 84: Async Iterator インターフェイスの省略可能なプロパティ
プロパティ 値 要件
"return" IteratorResult オブジェクトの promise を返す関数

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

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

"throw" IteratorResult オブジェクトの promise を返す関数

返される promise は、fulfilled されたとき、IteratorResult インターフェイスに適合するオブジェクトで fulfilled されなければなりません。このメソッドを呼び出すと、呼出し元がエラー状態を検出したことを async iterator オブジェクトへ通知します。引数はエラー状態を識別するために使用でき、通常は例外オブジェクトです。典型的な応答は、引数として渡された値で reject される rejected promise を返すことです。

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

注 2

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

27.1.1.5 IteratorResult インターフェイス

IteratorResult インターフェイスには、表 85 に列挙されるプロパティが含まれます。

表 85: IteratorResult インターフェイスのプロパティ
プロパティ 値 要件
"done" a Boolean これは iterator の next メソッド呼出しの結果状態です。iterator の終端に到達した場合、"done" は true です。終端に到達していない場合、"done" は false であり、値が利用可能です。"done" プロパティ(own または継承されたもの)が存在しない場合、その値は false であるとみなされます。
"value" an ECMAScript language value done が false である場合、これは現在の反復要素の値です。done が true である場合、iterator が戻り値を提供したなら、これはその戻り値です。iterator に戻り値がない場合、"value" は undefined です。その場合、適合オブジェクトが明示的な "value" プロパティを継承していなければ、"value" プロパティは存在しなくてもかまいません。

27.1.2 Iterator Helper オブジェクト

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

27.1.2.1 %IteratorHelperPrototype% オブジェクト

%IteratorHelperPrototype% オブジェクトは:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

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

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. obj を this 値とする。
  2. ? RequireInternalSlot(obj, [[UnderlyingIterators]]) を実行する。
  3. 表明: obj は [[GeneratorState]] 内部スロットを持つ。
  4. obj.[[GeneratorState]] が suspended-start である場合、
    1. obj.[[GeneratorState]] を completed に設定する。
    2. 注記: generator が completed 状態に入ると、その状態から離れることはなく、関連付けられた実行コンテキストが再開されることもない。この時点で obj に関連付けられたすべての実行状態を破棄できる。
    3. ? IteratorCloseAll(obj.[[UnderlyingIterators]], NormalCompletion(unused)) を実行する。
    4. CreateIteratorResultObject(undefined, true) を返す。
  5. completion を ReturnCompletion(undefined) とする。
  6. ? GeneratorResumeAbrupt(obj, completion, "Iterator Helper") を返す。

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

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

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

27.1.3 Iterator オブジェクト

27.1.3.1 Iterator コンストラクター

Iterator コンストラクターは:

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

27.1.3.1.1 Iterator ( )

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

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

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

Iterator コンストラクターは:

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

27.1.3.2.1 Iterator.concat ( ...items )

  1. iterables を新しい空の List とする。
  2. items の各要素 item について、次を行う。
    1. item が Object でない場合、TypeError 例外をスローする。
    2. method を ? GetMethod(item, %Symbol.iterator%) とする。
    3. method が undefined である場合、TypeError 例外をスローする。
    4. Record { [[OpenMethod]]: method, [[Iterable]]: item } を iterables に追加する。
  3. closure を、iterables を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. iterables の各 Record iterable について、次を行う。
      1. iterator を ? Call(iterable.[[OpenMethod]], iterable.[[Iterable]]) とする。
      2. iterator が Object でない場合、TypeError 例外をスローする。
      3. iteratorRecord を ? GetIteratorDirect(iterator) とする。
      4. innerAlive を true とする。
      5. innerAlive が true の間、次を繰り返す。
        1. innerValue を ? IteratorStepValue(iteratorRecord) とする。
        2. innerValue が done である場合、
          1. innerAlive を false に設定する。
        3. そうでない場合、
          1. completion を Completion(Yield(innerValue)) とする。
          2. completion が中断完了である場合、
            1. ? IteratorClose(iteratorRecord, completion) を返す。
    2. ReturnCompletion(undefined) を返す。
  4. gen を CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  5. gen.[[UnderlyingIterators]] を新しい空の List に設定する。
  6. gen を返す。

27.1.3.2.2 Iterator.from ( obj )

  1. iteratorRecord を ? GetIteratorFlattenable(obj, iterate-string-primitives) とする。
  2. hasInstance を ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]]) とする。
  3. hasInstance が true である場合、
    1. iteratorRecord.[[Iterator]] を返す。
  4. wrapper を OrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] ») とする。
  5. wrapper.[[Iterated]] を iteratorRecord に設定する。
  6. wrapper を返す。

27.1.3.2.2.1 %WrapForValidIteratorPrototype% オブジェクト

%WrapForValidIteratorPrototype% オブジェクトは:

27.1.3.2.2.1.1 %WrapForValidIteratorPrototype%.next ( )

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

27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. obj を this 値とする。
  2. ? RequireInternalSlot(obj, [[Iterated]]) を実行する。
  3. iterator を obj.[[Iterated]].[[Iterator]] とする。
  4. 表明: iterator は Object である。
  5. returnMethod を ? GetMethod(iterator, "return") とする。
  6. returnMethod が undefined である場合、
    1. CreateIteratorResultObject(undefined, true) を返す。
  7. ? Call(returnMethod, iterator) を返す。

27.1.3.2.3 Iterator.prototype

Iterator.prototype の初期値は Iterator prototype オブジェクトです。

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

27.1.3.2.4 Iterator.zip ( iterables [ , options ] )

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

  1. iterables が Object でない場合、TypeError 例外をスローする。
  2. options を ? GetOptionsObject(options) に設定する。
  3. mode を ? Get(options, "mode") とする。
  4. mode が undefined である場合、mode を "shortest" に設定する。
  5. mode が "shortest"、"longest"、または "strict" のいずれでもない場合、TypeError 例外をスローする。
  6. paddingOption を undefined とする。
  7. mode が "longest" である場合、
    1. paddingOption を ? Get(options, "padding") に設定する。
    2. paddingOption が undefined でなく、かつ paddingOption が Object でない場合、TypeError 例外をスローする。
  8. iters を新しい空の List とする。
  9. padding を新しい空の List とする。
  10. inputIter を ? GetIterator(iterables, sync) とする。
  11. next を not-started とする。
  12. next が done でない間、次を繰り返す。
    1. next を Completion(IteratorStepValue(inputIter)) に設定する。
    2. IfAbruptCloseIterators(next, iters)。
    3. next が done でない場合、
      1. iter を Completion(GetIteratorFlattenable(next, reject-primitives)) とする。
      2. needClosing を « inputIter » と iters のリスト連結とする。
      3. IfAbruptCloseIterators(iter, needClosing)。
      4. iter を iters に追加する。
  13. iterCount を iters の要素数とする。
  14. mode が "longest" である場合、
    1. paddingOption が undefined である場合、
      1. iterCount 回繰り返す。
        1. undefined を padding に追加する。
    2. そうでない場合、
      1. paddingIter を Completion(GetIterator(paddingOption, sync)) とする。
      2. IfAbruptCloseIterators(paddingIter, iters)。
      3. usingIterator を true とする。
      4. iterCount 回繰り返す。
        1. usingIterator が true である場合、
          1. next を Completion(IteratorStepValue(paddingIter)) に設定する。
          2. IfAbruptCloseIterators(next, iters)。
          3. next が done である場合、
            1. usingIterator を false に設定する。
          4. そうでない場合、
            1. next を padding に追加する。
        2. usingIterator が false である場合、undefined を padding に追加する。
      5. usingIterator が true である場合、
        1. completion を Completion(IteratorClose(paddingIter, NormalCompletion(unused))) とする。
        2. IfAbruptCloseIterators(completion, iters)。
  15. finishResults を、何も捕捉せず、パラメーター (results) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. CreateArrayFromList(results) を返す。
  16. IteratorZip(iters, mode, padding, finishResults) を返す。

27.1.3.2.5 Iterator.zipKeyed ( iterables [ , options ] )

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

  1. iterables が Object でない場合、TypeError 例外をスローする。
  2. options を ? GetOptionsObject(options) に設定する。
  3. mode を ? Get(options, "mode") とする。
  4. mode が undefined である場合、mode を "shortest" に設定する。
  5. mode が "shortest"、"longest"、または "strict" のいずれでもない場合、TypeError 例外をスローする。
  6. paddingOption を undefined とする。
  7. mode が "longest" である場合、
    1. paddingOption を ? Get(options, "padding") に設定する。
    2. paddingOption が undefined でなく、かつ paddingOption が Object でない場合、TypeError 例外をスローする。
  8. iters を新しい空の List とする。
  9. padding を新しい空の List とする。
  10. allKeys を ? iterables.[[OwnPropertyKeys]]() とする。
  11. keys を新しい空の List とする。
  12. allKeys の各要素 key について、次を行う。
    1. propertyDesc を Completion(iterables.[[GetOwnProperty]](key)) とする。
    2. IfAbruptCloseIterators(propertyDesc, iters)。
    3. propertyDesc が undefined でなく、かつ propertyDesc.[[Enumerable]] が true である場合、
      1. value を Completion(Get(iterables, key)) とする。
      2. IfAbruptCloseIterators(value, iters)。
      3. value が undefined でない場合、
        1. key を keys に追加する。
        2. iter を Completion(GetIteratorFlattenable(value, reject-primitives)) とする。
        3. IfAbruptCloseIterators(iter, iters)。
        4. iter を iters に追加する。
  13. iterCount を iters の要素数とする。
  14. mode が "longest" である場合、
    1. paddingOption が undefined である場合、
      1. iterCount 回繰り返す。
        1. undefined を padding に追加する。
    2. そうでない場合、
      1. keys の各要素 key について、次を行う。
        1. value を Completion(Get(paddingOption, key)) とする。
        2. IfAbruptCloseIterators(value, iters)。
        3. value を padding に追加する。
  15. finishResults を、keys と iterCount を捕捉し、パラメーター (results) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. obj を OrdinaryObjectCreate(null) とする。
    2. 0 ≤ i < iterCount を満たす各整数 i について、昇順に次を行う。
      1. ! CreateDataPropertyOrThrow(obj, keys[i], results[i]) を実行する。
    3. obj を返す。
  16. IteratorZip(iters, mode, padding, finishResults) を返す。

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

Iterator prototype オブジェクトは:

注

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

次の式は、ECMAScript コードが %Iterator.prototype% オブジェクトへアクセスする方法の1つです。

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

27.1.3.3.1 Iterator.prototype.constructor

Iterator.prototype.constructor は属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つアクセサープロパティです。[[Getter]] および [[Setter]] 属性は次のように定義されます。

27.1.3.3.1.1 get Iterator.prototype.constructor

[[Getter]] 属性の値は引数を必要としない組込み関数です。呼び出されたとき、次の手順を実行します。

  1. %Iterator% を返す。

27.1.3.3.1.2 set Iterator.prototype.constructor

[[Setter]] 属性の値は引数 v を取る組込み関数です。呼び出されたとき、次の手順を実行します。

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

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

27.1.3.3.2 Iterator.prototype.drop ( limit )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. numberLimit を Completion(ToNumber(limit)) とする。
  5. IfAbruptCloseIterator(numberLimit, iterated)。
  6. numberLimit が NaN である場合、
    1. error を ThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  7. numberLimit が有限であり、numberLimit > 𝔽(253 - 1) である場合、
    1. error を ThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  8. intLimit を ! ToIntegerOrInfinity(numberLimit) とする。
  9. intLimit < 0 である場合、
    1. error を ThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  10. iterated を ? GetIteratorDirect(obj) に設定する。
  11. closure を、iterated と intLimit を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. remaining を 𝔽(intLimit) とする。
    2. remaining > +0𝔽 の間、次を繰り返す。
      1. remaining を remaining - 1𝔽 に設定する。
      2. next を ? IteratorStep(iterated) とする。
      3. next が done である場合、ReturnCompletion(undefined) を返す。
    3. 次を繰り返す。
      1. value を ? IteratorStepValue(iterated) とする。
      2. value が done である場合、ReturnCompletion(undefined) を返す。
      3. completion を Completion(Yield(value)) とする。
      4. IfAbruptCloseIterator(completion, iterated)。
  12. result を CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  13. result.[[UnderlyingIterators]] を « iterated » に設定する。
  14. result を返す。

27.1.3.3.3 Iterator.prototype.every ( predicate )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false である場合、
    1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を +0𝔽 とする。
  7. 次を繰り返す。
    1. value を ? IteratorStepValue(iterated) とする。
    2. value が done である場合、true を返す。
    3. result を Completion(Call(predicate, undefined, « value, counter »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が false である場合、? IteratorClose(iterated, NormalCompletion(false)) を返す。
    6. 注記: 次の手順は、counter が 253𝔽 に達すると、それ以降 counter を変更しない。
    7. counter を counter + 1𝔽 に設定する。

27.1.3.3.4 Iterator.prototype.filter ( predicate )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false である場合、
    1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iterated と predicate を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. counter を +0𝔽 とする。
    2. 次を繰り返す。
      1. value を ? IteratorStepValue(iterated) とする。
      2. value が done である場合、ReturnCompletion(undefined) を返す。
      3. selected を Completion(Call(predicate, undefined, « value, counter »)) とする。
      4. IfAbruptCloseIterator(selected, iterated)。
      5. ToBoolean(selected) が true である場合、
        1. completion を Completion(Yield(value)) とする。
        2. IfAbruptCloseIterator(completion, iterated)。
      6. 注記: 次の手順は、counter が 253𝔽 に達すると、それ以降 counter を変更しない。
      7. counter を counter + 1𝔽 に設定する。
  7. result を CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

27.1.3.3.5 Iterator.prototype.find ( predicate )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false である場合、
    1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を +0𝔽 とする。
  7. 次を繰り返す。
    1. value を ? IteratorStepValue(iterated) とする。
    2. value が done である場合、undefined を返す。
    3. result を Completion(Call(predicate, undefined, « value, counter »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が true である場合、? IteratorClose(iterated, NormalCompletion(value)) を返す。
    6. 注記: 次の手順は、counter が 253𝔽 に達すると、それ以降 counter を変更しない。
    7. counter を counter + 1𝔽 に設定する。

27.1.3.3.6 Iterator.prototype.flatMap ( mapper )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(mapper) が false である場合、
    1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iterated と mapper を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. counter を +0𝔽 とする。
    2. 次を繰り返す。
      1. value を ? IteratorStepValue(iterated) とする。
      2. value が done である場合、ReturnCompletion(undefined) を返す。
      3. mapped を Completion(Call(mapper, undefined, « value, counter »)) とする。
      4. IfAbruptCloseIterator(mapped, iterated)。
      5. innerIterator を Completion(GetIteratorFlattenable(mapped, reject-primitives)) とする。
      6. IfAbruptCloseIterator(innerIterator, iterated)。
      7. innerAlive を true とする。
      8. innerAlive が true の間、次を繰り返す。
        1. innerValue を Completion(IteratorStepValue(innerIterator)) とする。
        2. IfAbruptCloseIterator(innerValue, iterated)。
        3. innerValue が done である場合、
          1. innerAlive を false に設定する。
        4. そうでない場合、
          1. completion を Completion(Yield(innerValue)) とする。
          2. completion が中断完了である場合、
            1. backupCompletion を Completion(IteratorClose(innerIterator, completion)) とする。
            2. IfAbruptCloseIterator(backupCompletion, iterated)。
            3. ? IteratorClose(iterated, completion) を返す。
      9. 注記: 次の手順は、counter が 253𝔽 に達すると、それ以降 counter を変更しない。
      10. counter を counter + 1𝔽 に設定する。
  7. result を CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

27.1.3.3.7 Iterator.prototype.forEach ( procedure )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(procedure) が false である場合、
    1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を +0𝔽 とする。
  7. 次を繰り返す。
    1. value を ? IteratorStepValue(iterated) とする。
    2. value が done である場合、undefined を返す。
    3. result を Completion(Call(procedure, undefined, « value, counter »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. 注記: 次の手順は、counter が 253𝔽 に達すると、それ以降 counter を変更しない。
    6. counter を counter + 1𝔽 に設定する。

27.1.3.3.8 Iterator.prototype.map ( mapper )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(mapper) が false である場合、
    1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. closure を、iterated と mapper を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. counter を +0𝔽 とする。
    2. 次を繰り返す。
      1. value を ? IteratorStepValue(iterated) とする。
      2. value が done である場合、ReturnCompletion(undefined) を返す。
      3. mapped を Completion(Call(mapper, undefined, « value, counter »)) とする。
      4. IfAbruptCloseIterator(mapped, iterated)。
      5. completion を Completion(Yield(mapped)) とする。
      6. IfAbruptCloseIterator(completion, iterated)。
      7. 注記: 次の手順は、counter が 253𝔽 に達すると、それ以降 counter を変更しない。
      8. counter を counter + 1𝔽 に設定する。
  7. result を CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  8. result.[[UnderlyingIterators]] を « iterated » に設定する。
  9. result を返す。

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

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(reducer) が false である場合、
    1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. initialValue が存在しない場合、
    1. accumulator を ? IteratorStepValue(iterated) とする。
    2. accumulator が done である場合、TypeError 例外をスローする。
    3. counter を 1𝔽 とする。
  7. そうでない場合、
    1. accumulator を initialValue とする。
    2. counter を +0𝔽 とする。
  8. 次を繰り返す。
    1. value を ? IteratorStepValue(iterated) とする。
    2. value が done である場合、accumulator を返す。
    3. result を Completion(Call(reducer, undefined, « accumulator, value, counter »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. accumulator を result に設定する。
    6. 注記: 次の手順は、counter が 253𝔽 に達すると、それ以降 counter を変更しない。
    7. counter を counter + 1𝔽 に設定する。

27.1.3.3.10 Iterator.prototype.some ( predicate )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. IsCallable(predicate) が false である場合、
    1. error を ThrowCompletion(新しく作成された TypeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  5. iterated を ? GetIteratorDirect(obj) に設定する。
  6. counter を +0𝔽 とする。
  7. 次を繰り返す。
    1. value を ? IteratorStepValue(iterated) とする。
    2. value が done である場合、false を返す。
    3. result を Completion(Call(predicate, undefined, « value, counter »)) とする。
    4. IfAbruptCloseIterator(result, iterated)。
    5. ToBoolean(result) が true である場合、? IteratorClose(iterated, NormalCompletion(true)) を返す。
    6. 注記: 次の手順は、counter が 253𝔽 に達すると、それ以降 counter を変更しない。
    7. counter を counter + 1𝔽 に設定する。

27.1.3.3.11 Iterator.prototype.take ( limit )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を Iterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false } とする。
  4. numberLimit を Completion(ToNumber(limit)) とする。
  5. IfAbruptCloseIterator(numberLimit, iterated)。
  6. numberLimit が NaN である場合、
    1. error を ThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  7. numberLimit が有限であり、numberLimit > 𝔽(253 - 1) である場合、
    1. error を ThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  8. intLimit を ! ToIntegerOrInfinity(numberLimit) とする。
  9. intLimit < 0 である場合、
    1. error を ThrowCompletion(新しく作成された RangeError オブジェクト) とする。
    2. ? IteratorClose(iterated, error) を返す。
  10. iterated を ? GetIteratorDirect(obj) に設定する。
  11. closure を、iterated と intLimit を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. remaining を 𝔽(intLimit) とする。
    2. 次を繰り返す。
      1. remaining が +0𝔽 である場合、
        1. ? IteratorClose(iterated, ReturnCompletion(undefined)) を返す。
      2. remaining を remaining - 1𝔽 に設定する。
      3. value を ? IteratorStepValue(iterated) とする。
      4. value が done である場合、ReturnCompletion(undefined) を返す。
      5. completion を Completion(Yield(value)) とする。
      6. IfAbruptCloseIterator(completion, iterated)。
  12. result を CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  13. result.[[UnderlyingIterators]] を « iterated » に設定する。
  14. result を返す。

27.1.3.3.12 Iterator.prototype.toArray ( )

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

  1. obj を this 値とする。
  2. obj が Object でない場合、TypeError 例外をスローする。
  3. iterated を ? GetIteratorDirect(obj) とする。
  4. items を新しい空の List とする。
  5. 次を繰り返す。
    1. value を ? IteratorStepValue(iterated) とする。
    2. value が done である場合、CreateArrayFromList(items) を返す。
    3. value を items に追加する。

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

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

  1. obj を this 値とする。
  2. return を ? GetMethod(obj, "return") とする。
  3. return が undefined でない場合、
    1. ? Call(return, obj) を実行する。
  4. undefined を返す。

このメソッドの "name" プロパティの値は "[Symbol.dispose]" です。

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

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

  1. this 値を返す。

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

27.1.3.3.15 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%] は属性 { [[Enumerable]]: false, [[Configurable]]: true } を持つアクセサープロパティです。[[Getter]] および [[Setter]] 属性は次のように定義されます。

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

[[Getter]] 属性の値は引数を必要としない組込み関数です。呼び出されたとき、次の手順を実行します。

  1. "Iterator" を返す。

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

[[Setter]] 属性の値は引数 v を取る組込み関数です。呼び出されたとき、次の手順を実行します。

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

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

27.1.3.4 Iterator のための抽象操作

27.1.3.4.1 IteratorZip ( iters, mode, padding, finishResults )

抽象操作 IteratorZip。引数 iters (リスト (要素:Iteratorレコード))、mode (("shortest"、"longest" または "strict"))、padding (リスト (要素:ECMAScript 言語値)) および finishResults (an Abstract Closure that takes a List of ECMAScript language values and returns an ECMAScript language value)。戻り値:Generator。 呼び出されると、次の手順を実行する。

  1. iterCount を iters の要素数とする。
  2. openIters を iters のコピーとする。
  3. closure を、iters、iterCount、openIters、mode、padding、および finishResults を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. iterCount = 0 である場合、ReturnCompletion(undefined) を返す。
    2. 次を繰り返す。
      1. results を新しい空の List とする。
      2. 表明: openIters は空でない。
      3. 0 ≤ i < iterCount を満たす各整数 i について、昇順に次を行う。
        1. iter を iters[i] とする。
        2. iter が null である場合、
          1. 表明: mode は "longest" である。
          2. result を padding[i] とする。
        3. そうでない場合、
          1. result を Completion(IteratorStepValue(iter)) とする。
          2. result が中断完了である場合、
            1. iter を openIters から削除する。
            2. ? IteratorCloseAll(openIters, result) を返す。
          3. result を ! result に設定する。
          4. result が done である場合、
            1. iter を openIters から削除する。
            2. mode が "shortest" である場合、
              1. ? IteratorCloseAll(openIters, ReturnCompletion(undefined)) を返す。
            3. そうでなく、mode が "strict" である場合、
              1. i ≠ 0 である場合、
                1. ? IteratorCloseAll(openIters, ThrowCompletion(新しく作成された TypeError オブジェクト)) を返す。
              2. 1 ≤ k < iterCount を満たす各整数 k について、昇順に次を行う。
                1. 表明: iters[k] は null でない。
                2. open を Completion(IteratorStep(iters[k])) とする。
                3. open が中断完了である場合、
                  1. iters[k] を openIters から削除する。
                  2. ? IteratorCloseAll(openIters, open) を返す。
                4. open を ! open に設定する。
                5. open が done である場合、
                  1. iters[k] を openIters から削除する。
                6. そうでない場合、
                  1. ? IteratorCloseAll(openIters, ThrowCompletion(新しく作成された TypeError オブジェクト)) を返す。
              3. ReturnCompletion(undefined) を返す。
            4. そうでない場合、
              1. 表明: mode は "longest" である。
              2. openIters が空である場合、ReturnCompletion(undefined) を返す。
              3. iters[i] を null に設定する。
              4. result を padding[i] に設定する。
        4. result を results に追加する。
      4. results を finishResults(results) に設定する。
      5. completion を Completion(Yield(results)) とする。
      6. IfAbruptCloseIterators(completion, openIters)。
  4. gen を CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] ») とする。
  5. gen.[[UnderlyingIterators]] を openIters に設定する。
  6. gen を返す。

27.1.4 %AsyncIteratorPrototype% オブジェクト

%AsyncIteratorPrototype% オブジェクトは:

注

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

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

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

  1. obj を this 値とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. return を Completion(GetMethod(obj, "return")) とする。
  4. IfAbruptRejectPromise(return, promiseCapability)。
  5. return が undefined である場合、
    1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行する。
  6. そうでない場合、
    1. result を Completion(Call(return, obj, « »)) とする。
    2. IfAbruptRejectPromise(result, promiseCapability)。
    3. resultWrapper を Completion(PromiseResolve(%Promise%, result)) とする。
    4. IfAbruptRejectPromise(resultWrapper, promiseCapability)。
    5. unwrap を、何も捕捉せず、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
      1. undefined を返す。
    6. onFulfilled を CreateBuiltinFunction(unwrap, 1, "", « ») とする。
    7. PerformPromiseThen(resultWrapper, onFulfilled, undefined, promiseCapability) を実行する。
  7. promiseCapability.[[Promise]] を返す。

このメソッドの "name" プロパティの値は "[Symbol.asyncDispose]" です。

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

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

  1. this 値を返す。

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

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

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

27.1.5.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

抽象操作 CreateAsyncFromSyncIterator。引数 syncIteratorRecord (Iteratorレコード)。戻り値:Iteratorレコード。 同期 Iterator Record から async Iterator Record を作成するために使用されます。 呼び出されると、次の手順を実行する。

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

27.1.5.2 %AsyncFromSyncIteratorPrototype% オブジェクト

%AsyncFromSyncIteratorPrototype% オブジェクトは:

27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. obj を this 値とする。
  2. 表明: obj は [[SyncIteratorRecord]] 内部スロットを持つ Object である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecord を obj.[[SyncIteratorRecord]] とする。
  5. value が存在する場合、
    1. result を Completion(IteratorNext(syncIteratorRecord, value)) とする。
  6. そうでない場合、
    1. result を Completion(IteratorNext(syncIteratorRecord)) とする。
  7. IfAbruptRejectPromise(result, promiseCapability)。
  8. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) を返す。

27.1.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

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

27.1.5.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

注
この仕様では value は常に指定されますが、%AsyncFromSyncIteratorPrototype%.return ( [ value ] ) との一貫性のため省略可能なままにされています。
  1. obj を this 値とする。
  2. 表明: obj は [[SyncIteratorRecord]] 内部スロットを持つ Object である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecord を obj.[[SyncIteratorRecord]] とする。
  5. syncIterator を syncIteratorRecord.[[Iterator]] とする。
  6. throw を Completion(GetMethod(syncIterator, "throw")) とする。
  7. IfAbruptRejectPromise(throw, promiseCapability)。
  8. throw が undefined である場合、
    1. 注記: syncIterator が throw メソッドを持たない場合、capability を reject する前にクリーンアップする機会を与えるため、それを close する。
    2. closeCompletion を NormalCompletion(empty) とする。
    3. result を Completion(IteratorClose(syncIteratorRecord, closeCompletion)) とする。
    4. IfAbruptRejectPromise(result, promiseCapability)。
    5. 注記: 次の手順は、プロトコル違反があったこと、すなわち syncIterator が throw メソッドを持たないことを示すため TypeError をスローする。
    6. 注記: syncIterator の close がスローしない場合、その操作の結果は、たとえ rejected promise を生成しても無視される。
    7. ! Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
    8. promiseCapability.[[Promise]] を返す。
  9. value が存在する場合、
    1. result を Completion(Call(throw, syncIterator, « value »)) とする。
  10. そうでない場合、
    1. result を Completion(Call(throw, syncIterator)) とする。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. result が Object でない場合、
    1. ! Call(promiseCapability.[[Reject]], undefined, « 新しく作成された TypeError オブジェクト ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true) を返す。

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

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

表 86: Async-from-Sync Iterator インスタンスの内部スロット
内部スロット 型 説明
[[SyncIteratorRecord]] an Iterator Record 適応対象となる元の同期 iterator を表します。

27.1.5.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

抽象操作 AsyncFromSyncIteratorContinuation。引数 result (Object)、promiseCapability (a PromiseCapability Record for an intrinsic %Promise%)、syncIteratorRecord (Iteratorレコード) および closeOnRejection (Boolean)。戻り値:Promise。 呼び出されると、次の手順を実行する。

  1. 注記: promiseCapability は intrinsic %Promise% から派生しているため、以下で IfAbruptRejectPromise を使用することで伴う promiseCapability.[[Reject]] の呼出しはスローしないことが保証される。
  2. done を Completion(IteratorComplete(result)) とする。
  3. IfAbruptRejectPromise(done, promiseCapability)。
  4. value を Completion(IteratorValue(result)) とする。
  5. IfAbruptRejectPromise(value, promiseCapability)。
  6. valueWrapper を Completion(PromiseResolve(%Promise%, value)) とする。
  7. valueWrapper が中断完了であり、done が false、かつ closeOnRejection が true である場合、
    1. valueWrapper を Completion(IteratorClose(syncIteratorRecord, valueWrapper)) に設定する。
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability)。
  9. unwrap を、done を捕捉し、パラメーター (value) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. CreateIteratorResultObject(value, done) を返す。
  10. onFulfilled を CreateBuiltinFunction(unwrap, 1, "", « ») とする。
  11. 注記: onFulfilled は IteratorResult オブジェクトの "value" プロパティを処理するとき、その値が promise であれば待機し、その結果を新しい「unwrapped」IteratorResult オブジェクトに再パッケージするために使用される。
  12. done が true または closeOnRejection が false である場合、
    1. onRejected を undefined とする。
  13. そうでない場合、
    1. closeIterator を、syncIteratorRecord を捕捉し、パラメーター (error) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
      1. ? IteratorClose(syncIteratorRecord, ThrowCompletion(error)) を返す。
    2. onRejected を CreateBuiltinFunction(closeIterator, 1, "", « ») とする。
    3. 注記: onRejected は Iterator が生成する IteratorResult オブジェクトの "value" プロパティが rejected promise である場合に、その Iterator を close するために使用される。
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability) を実行する。
  15. promiseCapability.[[Promise]] を返す。

27.2 リソース管理

27.2.1 共通リソース管理インターフェイス

27.2.1.1 Disposable インターフェイス

Disposable インターフェイスには、表 87 で説明されるプロパティが含まれます。

表 87: Disposable インターフェイスの必須プロパティ
プロパティ 値 要件
%Symbol.dispose% a function object

このメソッドを呼び出すと、呼出し元がこのオブジェクトを引き続き使用する意図がないことを Disposable オブジェクトへ通知します。このメソッドは、ファイルシステムハンドル、ストリーム、ホストオブジェクトなどを含むがこれらに限定されないリソースを明示的にクリーンアップするために必要なすべての処理を実行するべきです。このメソッドから例外がスローされた場合、通常はリソースを明示的に解放できなかったことを意味します。

同じオブジェクトに対してこのメソッドを複数回呼び出す場合、すでに dispose 済みのリソースに対するクリーンアップ処理の繰返しを避けるべきであり、最初の呼出しで例外がスローされた場合でも例外をスローするべきではありません。ただし、この要件は強制されません。

Disposable オブジェクトを using または await using 宣言で使用する場合、その宣言を直接含む Block または Module の評価が完了すると、リソースは自動的に dispose されます。

27.2.1.2 AsyncDisposable インターフェイス

AsyncDisposable インターフェイスには、表 88 で説明されるプロパティが含まれます。

表 88: AsyncDisposable インターフェイスの必須プロパティ
プロパティ 値 要件
%Symbol.asyncDispose% promise を返す function object

このメソッドを呼び出すと、呼出し元がこのオブジェクトを引き続き使用する意図がないことを AsyncDisposable オブジェクトへ通知します。このメソッドは、ファイルシステムハンドル、ストリーム、ホストオブジェクトなどを含むがこれらに限定されないリソースを明示的にクリーンアップするために必要なすべての処理を実行するべきです。このメソッドが返した promise が reject された場合、通常はリソースを明示的に解放できなかったことを意味します。AsyncDisposable オブジェクトは、結果として得られる Promise が fulfilled されるまで「disposed」とはみなされません。

同じオブジェクトに対してこのメソッドを複数回呼び出す場合、すでに dispose 済みのリソースに対するクリーンアップ処理の繰返しを避けるべきであり、最初の呼出しで例外がスローされた、または rejected promise が返された場合でも、例外をスローしたり rejected promise を返したりするべきではありません。ただし、この要件は強制されません。

AsyncDisposable オブジェクトを await using 宣言で使用する場合、その宣言を直接含む Block または Module の評価が完了すると、リソースは自動的に dispose されます。

27.3 DisposableStack オブジェクト

DisposableStack は、一緒に dispose されるべき1つ以上のリソースを保持するために使用できるオブジェクトです。

すべての DisposableStack オブジェクトは、相互排他的な2つの状態、disposed または pending のいずれかにあります。disposable stack d は、d に対して d.dispose() も d.move() も呼び出されていない場合に限り pending です。

27.3.1 DisposableStack コンストラクター

DisposableStack コンストラクターは:

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

27.3.1.1 DisposableStack ( )

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

  1. NewTarget が undefined である場合、TypeError 例外をスローする。
  2. disposableStack を ? OrdinaryCreateFromConstructor(NewTarget, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposableResourceStack]] ») とする。
  3. disposableStack.[[DisposableState]] を pending に設定する。
  4. disposableStack.[[DisposableResourceStack]] を新しい空の List に設定する。
  5. disposableStack を返す。

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

DisposableStack コンストラクターは:

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

27.3.2.1 DisposableStack.prototype

DisposableStack.prototype の初期値は DisposableStack prototype オブジェクトです。

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

27.3.3 DisposableStack Prototype オブジェクトのプロパティ

DisposableStack prototype オブジェクトは:

  • %DisposableStack.prototype% です。
  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 通常オブジェクトです。
  • [[DisposableState]] 内部スロットまたは DisposableStack インスタンスのその他の内部スロットを持ちません。

27.3.3.1 DisposableStack.prototype.adopt ( value, onDispose )

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

  1. disposableStack を this 値とする。
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]]) を実行する。
  3. disposableStack.[[DisposableState]] が disposed である場合、ReferenceError 例外をスローする。
  4. IsCallable(onDispose) が false である場合、TypeError 例外をスローする。
  5. closure を、value と onDispose を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. ? Call(onDispose, undefined, « value ») を返す。
  6. func を CreateBuiltinFunction(closure, 0, "", « ») とする。
  7. ? AddDisposableResource(disposableStack.[[DisposableResourceStack]], undefined, sync-dispose, func) を実行する。
  8. value を返す。

27.3.3.2 DisposableStack.prototype.constructor

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

27.3.3.3 DisposableStack.prototype.defer ( onDispose )

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

  1. disposableStack を this 値とする。
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]]) を実行する。
  3. disposableStack.[[DisposableState]] が disposed である場合、ReferenceError 例外をスローする。
  4. IsCallable(onDispose) が false である場合、TypeError 例外をスローする。
  5. ? AddDisposableResource(disposableStack.[[DisposableResourceStack]], undefined, sync-dispose, onDispose) を実行する。
  6. undefined を返す。

27.3.3.4 DisposableStack.prototype.dispose ( )

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

  1. disposableStack を this 値とする。
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]]) を実行する。
  3. disposableStack.[[DisposableState]] が disposed である場合、undefined を返す。
  4. disposableStack.[[DisposableState]] を disposed に設定する。
  5. ? DisposeResources(disposableStack.[[DisposableResourceStack]], NormalCompletion(undefined)) を返す。

27.3.3.5 get DisposableStack.prototype.disposed

DisposableStack.prototype.disposed は、set アクセサー関数が undefined であるアクセサープロパティです。その get アクセサー関数は、呼び出されたときに次の手順を実行します。

  1. disposableStack を this 値とする。
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]]) を実行する。
  3. disposableStack.[[DisposableState]] が disposed である場合、true を返す。
  4. false を返す。

27.3.3.6 DisposableStack.prototype.move ( )

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

  1. disposableStack を this 値とする。
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]]) を実行する。
  3. disposableStack.[[DisposableState]] が disposed である場合、ReferenceError 例外をスローする。
  4. newDisposableStack を ? OrdinaryCreateFromConstructor(%DisposableStack%, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposableResourceStack]] ») とする。
  5. newDisposableStack.[[DisposableState]] を pending に設定する。
  6. newDisposableStack.[[DisposableResourceStack]] を disposableStack.[[DisposableResourceStack]] に設定する。
  7. disposableStack.[[DisposableResourceStack]] を新しい空の List に設定する。
  8. disposableStack.[[DisposableState]] を disposed に設定する。
  9. newDisposableStack を返す。

27.3.3.7 DisposableStack.prototype.use ( value )

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

  1. disposableStack を this 値とする。
  2. ? RequireInternalSlot(disposableStack, [[DisposableState]]) を実行する。
  3. disposableStack.[[DisposableState]] が disposed である場合、ReferenceError 例外をスローする。
  4. ? AddDisposableResource(disposableStack.[[DisposableResourceStack]], value, sync-dispose) を実行する。
  5. value を返す。

27.3.3.8 DisposableStack.prototype [ %Symbol.dispose% ] ( )

%Symbol.dispose% プロパティの初期値は、27.3.3.4 で定義される %DisposableStack.prototype.dispose% です。

27.3.3.9 DisposableStack.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "DisposableStack" です。

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

27.3.4 DisposableStack インスタンスのプロパティ

DisposableStack インスタンスは DisposableStack prototype オブジェクト(intrinsic %DisposableStack.prototype%)からプロパティを継承する通常オブジェクトです。DisposableStack インスタンスは、表 89 で説明される内部スロットを持つ状態で最初に作成されます。

表 89: DisposableStack インスタンスの内部スロット
内部スロット 型 説明
[[DisposableState]] pending or disposed disposable stack がその %Symbol.dispose% メソッドへの呼出しにどのように反応するかを制御します。
[[DisposableResourceStack]] a List of DisposableResource Records disposable stack が dispose されたときに dispose されるリソース。リソースは初期化された順序で追加され、逆順で dispose されます。

27.4 AsyncDisposableStack オブジェクト

AsyncDisposableStack は、非同期にまとめて dispose されるべき1つ以上のリソースを保持するために使用できるオブジェクトです。

すべての AsyncDisposableStack オブジェクトは、相互排他的な2つの状態、disposed または pending のいずれかにあります。async-disposable stack d は、d に対して d.disposeAsync() も d.move() も呼び出されていない場合に限り pending です。

27.4.1 AsyncDisposableStack コンストラクター

AsyncDisposableStack コンストラクターは:

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

27.4.1.1 AsyncDisposableStack ( )

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

  1. NewTarget が undefined である場合、TypeError 例外をスローする。
  2. asyncDisposableStack を ? OrdinaryCreateFromConstructor(NewTarget, "%AsyncDisposableStack.prototype%", « [[AsyncDisposableState]], [[DisposableResourceStack]] ») とする。
  3. asyncDisposableStack.[[AsyncDisposableState]] を pending に設定する。
  4. asyncDisposableStack.[[DisposableResourceStack]] を新しい空の List に設定する。
  5. asyncDisposableStack を返す。

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

AsyncDisposableStack コンストラクターは:

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

27.4.2.1 AsyncDisposableStack.prototype

AsyncDisposableStack.prototype の初期値は AsyncDisposableStack prototype オブジェクトです。

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

27.4.3 AsyncDisposableStack Prototype オブジェクトのプロパティ

AsyncDisposableStack prototype オブジェクトは:

  • %AsyncDisposableStack.prototype% です。
  • 値が %Object.prototype% である [[Prototype]] 内部スロットを持ちます。
  • 通常オブジェクトです。
  • [[AsyncDisposableState]] 内部スロットまたは AsyncDisposableStack インスタンスのその他の内部スロットを持ちません。

27.4.3.1 AsyncDisposableStack.prototype.adopt ( value, onDisposeAsync )

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

  1. asyncDisposableStack を this 値とする。
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]]) を実行する。
  3. asyncDisposableStack.[[AsyncDisposableState]] が disposed である場合、ReferenceError 例外をスローする。
  4. IsCallable(onDisposeAsync) が false である場合、TypeError 例外をスローする。
  5. closure を、value と onDisposeAsync を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. ? Call(onDisposeAsync, undefined, « value ») を返す。
  6. func を CreateBuiltinFunction(closure, 0, "", « ») とする。
  7. ? AddDisposableResource(asyncDisposableStack.[[DisposableResourceStack]], undefined, async-dispose, func) を実行する。
  8. value を返す。

27.4.3.2 AsyncDisposableStack.prototype.constructor

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

27.4.3.3 AsyncDisposableStack.prototype.defer ( onDisposeAsync )

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

  1. asyncDisposableStack を this 値とする。
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]]) を実行する。
  3. asyncDisposableStack.[[AsyncDisposableState]] が disposed である場合、ReferenceError 例外をスローする。
  4. IsCallable(onDisposeAsync) が false である場合、TypeError 例外をスローする。
  5. ? AddDisposableResource(asyncDisposableStack.[[DisposableResourceStack]], undefined, async-dispose, onDisposeAsync) を実行する。
  6. undefined を返す。

27.4.3.4 AsyncDisposableStack.prototype.disposeAsync ( )

この async メソッドは呼び出されたとき、次の手順を実行します。

  1. asyncDisposableStack を this 値とする。
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]]) を実行する。
  3. asyncDisposableStack.[[AsyncDisposableState]] が disposed である場合、undefined を返す。
  4. asyncDisposableStack.[[AsyncDisposableState]] を disposed に設定する。
  5. ? DisposeResources(asyncDisposableStack.[[DisposableResourceStack]], NormalCompletion(undefined)) を返す。

27.4.3.5 get AsyncDisposableStack.prototype.disposed

AsyncDisposableStack.prototype.disposed は、set アクセサー関数が undefined であるアクセサープロパティです。その get アクセサー関数は、呼び出されたときに次の手順を実行します。

  1. asyncDisposableStack を this 値とする。
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]]) を実行する。
  3. asyncDisposableStack.[[AsyncDisposableState]] が disposed である場合、true を返す。
  4. false を返す。

27.4.3.6 AsyncDisposableStack.prototype.move ( )

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

  1. asyncDisposableStack を this 値とする。
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]]) を実行する。
  3. asyncDisposableStack.[[AsyncDisposableState]] が disposed である場合、ReferenceError 例外をスローする。
  4. newAsyncDisposableStack を ? OrdinaryCreateFromConstructor(%AsyncDisposableStack%, "%AsyncDisposableStack.prototype%", « [[AsyncDisposableState]], [[DisposableResourceStack]] ») とする。
  5. newAsyncDisposableStack.[[AsyncDisposableState]] を pending に設定する。
  6. newAsyncDisposableStack.[[DisposableResourceStack]] を asyncDisposableStack.[[DisposableResourceStack]] に設定する。
  7. asyncDisposableStack.[[DisposableResourceStack]] を新しい空の List に設定する。
  8. asyncDisposableStack.[[AsyncDisposableState]] を disposed に設定する。
  9. newAsyncDisposableStack を返す。

27.4.3.7 AsyncDisposableStack.prototype.use ( value )

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

  1. asyncDisposableStack を this 値とする。
  2. ? RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]]) を実行する。
  3. asyncDisposableStack.[[AsyncDisposableState]] が disposed である場合、ReferenceError 例外をスローする。
  4. ? AddDisposableResource(asyncDisposableStack.[[DisposableResourceStack]], value, async-dispose) を実行する。
  5. value を返す。

27.4.3.8 AsyncDisposableStack.prototype [ %Symbol.asyncDispose% ] ( )

%Symbol.asyncDispose% プロパティの初期値は、27.4.3.4 で定義される %AsyncDisposableStack.prototype.disposeAsync% です。

27.4.3.9 AsyncDisposableStack.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% プロパティの初期値は String 値 "AsyncDisposableStack" です。

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

27.4.4 AsyncDisposableStack インスタンスのプロパティ

AsyncDisposableStack インスタンスは AsyncDisposableStack prototype オブジェクト(intrinsic %AsyncDisposableStack.prototype%)からプロパティを継承する通常オブジェクトです。AsyncDisposableStack インスタンスは、表 90 で説明される内部スロットを持つ状態で最初に作成されます。

表 90: AsyncDisposableStack インスタンスの内部スロット
内部スロット 型 説明
[[AsyncDisposableState]] pending or disposed disposable stack がその %Symbol.asyncDispose% メソッドへの呼出しにどのように反応するかを制御します。
[[DisposableResourceStack]] a List of DisposableResource Records disposable stack が dispose されたときに dispose されるリソース。リソースは初期化された順序で追加され、逆順で dispose されます。

27.5 Promise オブジェクト

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

すべての Promise は、相互排他的な3つの状態、fulfilled、rejected、および pending のいずれかにあります。

  • promise p は、p.then(f, r) が関数 f を呼び出す Job を直ちにキューに追加する場合、fulfilled です。
  • promise p は、p.then(f, r) が関数 r を呼び出す Job を直ちにキューに追加する場合、rejected です。
  • promise は、fulfilled でも rejected でもない場合、pending です。

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

promise は、settled であるか、別の promise の状態と一致するように「固定」されている場合、resolved です。resolved promise を resolve または reject しようとしても効果はありません。promise は resolved でない場合、unresolved です。unresolved promise は常に pending 状態です。resolved promise は pending、fulfilled、または rejected のいずれかである可能性があります。

thenable とは、Get(obj, "then") が function object を返すオブジェクト obj です。

27.5.1 Promise の抽象操作

27.5.1.1 PromiseCapability Record

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

PromiseCapability Record は 表 91 に列挙されるフィールドを持ちます。

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

27.5.1.1.1 IfAbruptRejectPromise ( value, capability )

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

  1. IfAbruptRejectPromise(value, capability).

は、次と同じ意味です。

  1. 表明: value は Completion Record である。
  2. value が中断完了である場合、
    1. ? Call(capability.[[Reject]], undefined, « value.[[Value]] ») を実行する。
    2. capability.[[Promise]] を返す。
  3. value を ! value に設定する。

27.5.1.2 PromiseReaction Record

PromiseReaction Record は、promise が特定の値で resolved または rejected になったときにどのように反応するべきかについての情報を保存するために使用される Record です。PromiseReaction Record は PerformPromiseThen 抽象操作によって作成され、NewPromiseReactionJob が返す Abstract Closure によって使用されます。

PromiseReaction Record は 表 92 に列挙されるフィールドを持ちます。

表 92: PromiseReaction Record のフィールド
フィールド名 値 意味
[[Capability]] a PromiseCapability Record or undefined この Record が reaction handler を提供する promise の capability。
[[Type]] fulfill or reject [[Handler]] が empty の場合、settlement type に固有の動作を可能にするため [[Type]] が使用されます。
[[Handler]] a JobCallback Record or empty 入力値に適用され、その戻り値が派生 promise に何が起こるかを決定する関数。[[Handler]] が empty の場合、代わりに [[Type]] の値に依存する関数が使用されます。

27.5.1.3 CreateResolvingFunctions ( toResolve )

抽象操作 CreateResolvingFunctions。引数 toResolve (Promise)。戻り値:レコード (フィールド:[[Resolve]] (関数オブジェクト), [[Reject]] (関数オブジェクト))。 呼び出されると、次の手順を実行する。

  1. promiseOrEmpty を Record { [[Value]]: toResolve } とする。
  2. resolveSteps を、promiseOrEmpty を捕捉し、パラメーター (resolution) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. promiseOrEmpty.[[Value]] が empty である場合、undefined を返す。
    2. promise を promiseOrEmpty.[[Value]] とする。
    3. promiseOrEmpty.[[Value]] を empty に設定する。
    4. SameValue(resolution, promise) が true である場合、
      1. selfResolutionError を新しく作成された TypeError オブジェクトとする。
      2. RejectPromise(promise, selfResolutionError) を実行する。
      3. undefined を返す。
    5. resolution が Object でない場合、
      1. FulfillPromise(promise, resolution) を実行する。
      2. undefined を返す。
    6. then を Completion(Get(resolution, "then")) とする。
    7. then が中断完了である場合、
      1. RejectPromise(promise, then.[[Value]]) を実行する。
      2. undefined を返す。
    8. thenAction を then.[[Value]] とする。
    9. IsCallable(thenAction) が false である場合、
      1. FulfillPromise(promise, resolution) を実行する。
      2. undefined を返す。
    10. thenJobCallback を HostMakeJobCallback(thenAction) とする。
    11. job を NewPromiseResolveThenableJob(promise, resolution, thenJobCallback) とする。
    12. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する。
    13. undefined を返す。
  3. resolve を CreateBuiltinFunction(resolveSteps, 1, "", « ») とする。
  4. rejectSteps を、promiseOrEmpty を捕捉し、パラメーター (reason) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. promiseOrEmpty.[[Value]] が empty である場合、undefined を返す。
    2. promise を promiseOrEmpty.[[Value]] とする。
    3. promiseOrEmpty.[[Value]] を empty に設定する。
    4. RejectPromise(promise, reason) を実行する。
    5. undefined を返す。
  5. reject を CreateBuiltinFunction(rejectSteps, 1, "", « ») とする。
  6. Record { [[Resolve]]: resolve, [[Reject]]: reject } を返す。

27.5.1.4 FulfillPromise ( promise, value )

抽象操作 FulfillPromise。引数 promise (Promise) および value (ECMAScript 言語値)。戻り値:unused。 呼び出されると、次の手順を実行する。

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

27.5.1.5 NewPromiseCapability ( ctor )

抽象操作 NewPromiseCapability。引数 ctor (ECMAScript 言語値)。戻り値:(正常完了 (値:PromiseCapabilityレコード) または throw 完了)。 組込み Promise コンストラクターと同じ方法で ctor をコンストラクターとして使用し、promise を作成してその resolve および reject 関数を抽出しようとします。promise と resolve および reject 関数は、新しい PromiseCapability Record を初期化するために使用されます。 呼び出されると、次の手順を実行する。

  1. IsConstructor(ctor) が false である場合、TypeError 例外をスローする。
  2. 注記: ctor は Promise コンストラクターのパラメーター規約をサポートするコンストラクター関数であると仮定される(27.5.3.1 を参照)。
  3. resolvingFuncs を Record { [[Resolve]]: undefined, [[Reject]]: undefined } とする。
  4. executorClosure を、resolvingFuncs を捕捉し、パラメーター (resolve, reject) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. resolvingFuncs.[[Resolve]] が undefined でない場合、TypeError 例外をスローする。
    2. resolvingFuncs.[[Reject]] が undefined でない場合、TypeError 例外をスローする。
    3. resolvingFuncs.[[Resolve]] を resolve に設定する。
    4. resolvingFuncs.[[Reject]] を reject に設定する。
    5. NormalCompletion(undefined) を返す。
  5. executor を CreateBuiltinFunction(executorClosure, 2, "", « ») とする。
  6. promise を ? Construct(ctor, « executor ») とする。
  7. IsCallable(resolvingFuncs.[[Resolve]]) が false である場合、TypeError 例外をスローする。
  8. IsCallable(resolvingFuncs.[[Reject]]) が false である場合、TypeError 例外をスローする。
  9. PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFuncs.[[Resolve]], [[Reject]]: resolvingFuncs.[[Reject]] } を返す。
注

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

27.5.1.6 IsPromise ( arg )

抽象操作 IsPromise。引数 arg (ECMAScript 言語値)。戻り値:Boolean。 オブジェクトに promise brand があるかどうかを確認します。 呼び出されると、次の手順を実行する。

  1. arg が Object でない場合、false を返す。
  2. arg が [[PromiseState]] 内部スロットを持たない場合、false を返す。
  3. true を返す。

27.5.1.7 RejectPromise ( promise, reason )

抽象操作 RejectPromise。引数 promise (Promise) および reason (ECMAScript 言語値)。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. 表明: promise.[[PromiseState]] は pending である。
  2. reactions を promise.[[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.5.1.8 TriggerPromiseReactions ( reactions, arg )

抽象操作 TriggerPromiseReactions。引数 reactions (リスト (要素:PromiseReactionレコード)) および arg (ECMAScript 言語値)。戻り値:unused。 reactions 内の各 Record について新しい Job をキューに追加します。その各 Job は PromiseReaction Record の [[Type]] および [[Handler]] を処理し、[[Handler]] が empty でない場合、指定された引数を渡してそれを呼び出します。[[Handler]] が empty である場合、動作は [[Type]] によって決定されます。 呼び出されると、次の手順を実行する。

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

27.5.1.9 HostPromiseRejectionTracker ( promise, operation )

ホスト定義の抽象操作 HostPromiseRejectionTracker。引数 promise (Promise) および operation (("reject" または "handle"))。戻り値:unused。 ホスト環境が promise の rejection を追跡できるようにします。

HostPromiseRejectionTracker の既定の実装は unused を返します。

注 1

HostPromiseRejectionTracker は次の2つの状況で呼び出されます。

  • promise が handler なしで reject された場合、operation 引数を "reject" に設定して呼び出されます。
  • rejected promise に初めて handler が追加された場合、operation 引数を "handle" に設定して呼び出されます。

HostPromiseRejectionTracker の典型的な実装では、未処理の rejection を開発者へ通知すると同時に、後から新しい handler が取り付けられて以前の通知が無効になった場合にも、それを通知するよう注意することが考えられます。

注 2

operation が "handle" である場合、実装はガベージコレクションを妨げる方法で promise への参照を保持するべきではありません。operation が "reject" である場合、rejection はまれであり hot code path には存在しないと想定されるため、実装は promise への参照を保持してもかまいません。

27.5.2 Promise Job

27.5.2.1 NewPromiseReactionJob ( reaction, arg )

抽象操作 NewPromiseReactionJob。引数 reaction (PromiseReactionレコード) および arg (ECMAScript 言語値)。戻り値:レコード (フィールド:[[Job]] (a Job Abstract Closure), [[Realm]] ((Realmレコード または null)))。 入力値に適切な handler を適用し、その handler の戻り値を使用して、その handler に関連付けられた派生 promise を resolve または reject する新しい Job Abstract Closure を返します。 呼び出されると、次の手順を実行する。

  1. job を、reaction と arg を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Job Abstract Closure とする。
    1. promiseCapability を reaction.[[Capability]] とする。
    2. type を reaction.[[Type]] とする。
    3. handler を reaction.[[Handler]] とする。
    4. handler が empty である場合、
      1. type が fulfill である場合、
        1. handlerResult を NormalCompletion(arg) とする。
      2. そうでない場合、
        1. 表明: type は reject である。
        2. handlerResult を ThrowCompletion(arg) とする。
    5. そうでない場合、
      1. handlerResult を Completion(HostCallJobCallback(handler, undefined, « arg »)) とする。
    6. promiseCapability が undefined である場合、
      1. 表明: handlerResult は中断完了でない。
      2. empty を返す。
    7. 表明: promiseCapability は PromiseCapability Record である。
    8. handlerResult が中断完了である場合、
      1. ? Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] ») を返す。
    9. ? Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] ») を返す。
  2. handlerRealm を null とする。
  3. reaction.[[Handler]] が empty でない場合、
    1. getHandlerRealmResult を Completion(GetFunctionRealm(reaction.[[Handler]].[[Callback]])) とする。
    2. getHandlerRealmResult が正常完了である場合、handlerRealm を getHandlerRealmResult.[[Value]] に設定する。
    3. そうでない場合、handlerRealm を現在の Realm Record に設定する。
    4. 注記: handler が undefined でない限り、handlerRealm が null になることはない。handler が revoke された Proxy であり ECMAScript コードが実行されない場合、handlerRealm はエラーオブジェクトを作成するために使用される。
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm } を返す。

27.5.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

抽象操作 NewPromiseResolveThenableJob。引数 promiseToResolve (Promise)、thenable (Object) および then (JobCallbackレコード)。戻り値:レコード (フィールド:[[Job]] (a Job Abstract Closure), [[Realm]] (Realmレコード))。 呼び出されると、次の手順を実行する。

  1. job を、promiseToResolve、thenable、および then を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Job Abstract Closure とする。
    1. resolvingFuncs を CreateResolvingFunctions(promiseToResolve) とする。
    2. thenCallResult を Completion(HostCallJobCallback(then, thenable, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »)) とする。
    3. thenCallResult が中断完了である場合、
      1. ? Call(resolvingFuncs.[[Reject]], undefined, « thenCallResult.[[Value]] ») を返す。
    4. ! thenCallResult を返す。
  2. getThenRealmResult を Completion(GetFunctionRealm(then.[[Callback]])) とする。
  3. getThenRealmResult が正常完了である場合、thenRealm を getThenRealmResult.[[Value]] とする。
  4. そうでない場合、thenRealm を現在の Realm Record とする。
  5. 注記: thenRealm が null になることはない。then.[[Callback]] が revoke された Proxy でありコードが実行されない場合、thenRealm はエラーオブジェクトを作成するために使用される。
  6. Record { [[Job]]: job, [[Realm]]: thenRealm } を返す。
注

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

27.5.3 Promise コンストラクター

Promise コンストラクターは:

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

27.5.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. resolvingFuncs を CreateResolvingFunctions(promise) とする。
  10. completion を Completion(Call(executor, undefined, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »)) とする。
  11. completion が中断完了である場合、
    1. ? Call(resolvingFuncs.[[Reject]], undefined, « completion.[[Value]] ») を実行する。
  12. promise を返す。
注

executor 引数は function object でなければなりません。この Promise によって表される、場合によっては遅延される処理の開始および完了の報告のために呼び出されます。executor は2つの引数、resolve と reject で呼び出されます。これらは、遅延計算の最終的な完了または失敗を報告するために executor 関数が使用できる関数です。executor 関数から戻ることは、遅延処理が完了したことを意味するのではなく、遅延処理を最終的に実行する要求が受け付けられたことだけを意味します。

executor 関数へ渡される resolve 関数は単一の引数を受け取ります。executor コードは最終的に resolve 関数を呼び出して、関連付けられた Promise を resolve したいことを示すことができます。resolve 関数へ渡される引数は遅延処理の最終的な値を表し、実際の fulfillment 値でも、fulfilled された場合に値を提供する別の promise でもかまいません。

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

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

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

Promise コンストラクターは:

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

27.5.4.1 Promise.all ( iterable )

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

  1. ctor を this 値とする。
  2. promiseCapability を ? NewPromiseCapability(ctor) とする。
  3. promiseResolve を Completion(GetPromiseResolve(ctor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecord を Completion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. result を Completion(PerformPromiseAll(iteratorRecord, ctor, promiseCapability, promiseResolve)) とする。
  8. result が中断完了である場合、
    1. iteratorRecord.[[Done]] が false である場合、result を Completion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. ! result を返す。
注

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

27.5.4.1.1 GetPromiseResolve ( promiseCtor )

抽象操作 GetPromiseResolve。引数 promiseCtor (コンストラクター)。戻り値:(正常完了 (値:関数オブジェクト) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. promiseResolve を ? Get(promiseCtor, "resolve") とする。
  2. IsCallable(promiseResolve) が false である場合、TypeError 例外をスローする。
  3. promiseResolve を返す。

27.5.4.1.2 PerformPromiseAll ( iteratorRecord, ctor, resultCapability, promiseResolve )

抽象操作 PerformPromiseAll。引数 iteratorRecord (Iteratorレコード)、ctor (コンストラクター)、resultCapability (PromiseCapabilityレコード) および promiseResolve (関数オブジェクト)。戻り値:(正常完了 (値:Object) または throw 完了)。 呼び出されると、次の手順を実行する。

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

27.5.4.2 Promise.allSettled ( iterable )

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

  1. ctor を this 値とする。
  2. promiseCapability を ? NewPromiseCapability(ctor) とする。
  3. promiseResolve を Completion(GetPromiseResolve(ctor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecord を Completion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. result を Completion(PerformPromiseAllSettled(iteratorRecord, ctor, promiseCapability, promiseResolve)) とする。
  8. result が中断完了である場合、
    1. iteratorRecord.[[Done]] が false である場合、result を Completion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. ! result を返す。
注

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

27.5.4.2.1 PerformPromiseAllSettled ( iteratorRecord, ctor, resultCapability, promiseResolve )

抽象操作 PerformPromiseAllSettled。引数 iteratorRecord (Iteratorレコード)、ctor (コンストラクター)、resultCapability (PromiseCapabilityレコード) および promiseResolve (関数オブジェクト)。戻り値:(正常完了 (値:Object) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. values を新しい空の List とする。
  2. 注記: remainingElementsCount は 0 ではなく 1 から開始する。これは、入力 iterator が使い切られる前に渡された callback のいずれかを呼び出す不正な "then" が存在しても、resultCapability.[[Resolve]] が1回だけ呼び出されることを保証するためである。
  3. remainingElementsCount を Record { [[Value]]: 1 } とする。
  4. index を 0 とする。
  5. 次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done である場合、
      1. remainingElementsCount.[[Value]] を remainingElementsCount.[[Value]] - 1 に設定する。
      2. remainingElementsCount.[[Value]] = 0 である場合、
        1. valuesArray を CreateArrayFromList(values) とする。
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を実行する。
      3. resultCapability.[[Promise]] を返す。
    3. undefined を values に追加する。
    4. nextPromise を ? Call(promiseResolve, ctor, « next ») とする。
    5. alreadyCalled を Record { [[Value]]: false } とする。
    6. fulfilledSteps を、values、resultCapability、および remainingElementsCount を捕捉し、パラメーター (value) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]].[[Value]] が true である場合、undefined を返す。
      3. activeFunc.[[AlreadyCalled]].[[Value]] を true に設定する。
      4. obj を OrdinaryObjectCreate(%Object.prototype%) とする。
      5. ! CreateDataPropertyOrThrow(obj, "status", "fulfilled") を実行する。
      6. ! CreateDataPropertyOrThrow(obj, "value", value) を実行する。
      7. thisIndex を activeFunc.[[Index]] とする。
      8. values[thisIndex] を obj に設定する。
      9. remainingElementsCount.[[Value]] を remainingElementsCount.[[Value]] - 1 に設定する。
      10. remainingElementsCount.[[Value]] = 0 である場合、
        1. valuesArray を CreateArrayFromList(values) とする。
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を返す。
      11. undefined を返す。
    7. onFulfilled を CreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    8. onFulfilled.[[AlreadyCalled]] を alreadyCalled に設定する。
    9. onFulfilled.[[Index]] を index に設定する。
    10. rejectedSteps を、values、resultCapability、および remainingElementsCount を捕捉し、パラメーター (error) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
      1. activeFunc をアクティブな関数オブジェクトとする。
      2. activeFunc.[[AlreadyCalled]].[[Value]] が true である場合、undefined を返す。
      3. activeFunc.[[AlreadyCalled]].[[Value]] を true に設定する。
      4. obj を OrdinaryObjectCreate(%Object.prototype%) とする。
      5. ! CreateDataPropertyOrThrow(obj, "status", "rejected") を実行する。
      6. ! CreateDataPropertyOrThrow(obj, "reason", error) を実行する。
      7. thisIndex を activeFunc.[[Index]] とする。
      8. values[thisIndex] を obj に設定する。
      9. remainingElementsCount.[[Value]] を remainingElementsCount.[[Value]] - 1 に設定する。
      10. remainingElementsCount.[[Value]] = 0 である場合、
        1. valuesArray を CreateArrayFromList(values) とする。
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray ») を返す。
      11. undefined を返す。
    11. onRejected を CreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] ») とする。
    12. onRejected.[[AlreadyCalled]] を alreadyCalled に設定する。
    13. onRejected.[[Index]] を index に設定する。
    14. index を index + 1 に設定する。
    15. remainingElementsCount.[[Value]] を remainingElementsCount.[[Value]] + 1 に設定する。
    16. ? Invoke(nextPromise, "then", « onFulfilled, onRejected ») を実行する。

27.5.4.3 Promise.any ( iterable )

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

  1. ctor を this 値とする。
  2. promiseCapability を ? NewPromiseCapability(ctor) とする。
  3. promiseResolve を Completion(GetPromiseResolve(ctor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecord を Completion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. result を Completion(PerformPromiseAny(iteratorRecord, ctor, promiseCapability, promiseResolve)) とする。
  8. result が中断完了である場合、
    1. iteratorRecord.[[Done]] が false である場合、result を Completion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. ! result を返す。
注

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

27.5.4.3.1 PerformPromiseAny ( iteratorRecord, ctor, resultCapability, promiseResolve )

抽象操作 PerformPromiseAny。引数 iteratorRecord (Iteratorレコード)、ctor (コンストラクター)、resultCapability (PromiseCapabilityレコード) および promiseResolve (関数オブジェクト)。戻り値:(正常完了 (値:Object) または throw 完了)。 呼び出されると、次の手順を実行する。

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

27.5.4.4 Promise.prototype

Promise.prototype の初期値は Promise prototype オブジェクトです。

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

27.5.4.5 Promise.race ( iterable )

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

  1. ctor を this 値とする。
  2. promiseCapability を ? NewPromiseCapability(ctor) とする。
  3. promiseResolve を Completion(GetPromiseResolve(ctor)) とする。
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)。
  5. iteratorRecord を Completion(GetIterator(iterable, sync)) とする。
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)。
  7. result を Completion(PerformPromiseRace(iteratorRecord, ctor, promiseCapability, promiseResolve)) とする。
  8. result が中断完了である場合、
    1. iteratorRecord.[[Done]] が false である場合、result を Completion(IteratorClose(iteratorRecord, result)) に設定する。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. ! result を返す。
注 1

iterable 引数が値を生成しない場合、または iterable が生成する promise のいずれも決して settle しない場合、このメソッドが返す pending promise は決して settle しません。

注 2

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

27.5.4.5.1 PerformPromiseRace ( iteratorRecord, ctor, resultCapability, promiseResolve )

抽象操作 PerformPromiseRace。引数 iteratorRecord (Iteratorレコード)、ctor (コンストラクター)、resultCapability (PromiseCapabilityレコード) および promiseResolve (関数オブジェクト)。戻り値:(正常完了 (値:Object) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. 次を繰り返す。
    1. next を ? IteratorStepValue(iteratorRecord) とする。
    2. next が done である場合、
      1. resultCapability.[[Promise]] を返す。
    3. nextPromise を ? Call(promiseResolve, ctor, « next ») とする。
    4. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») を実行する。

27.5.4.6 Promise.reject ( reason )

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

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

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

27.5.4.7 Promise.resolve ( resolution )

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

  1. ctor を this 値とする。
  2. ctor が Object でない場合、TypeError 例外をスローする。
  3. ? PromiseResolve(ctor, resolution) を返す。
注

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

27.5.4.7.1 PromiseResolve ( ctor, resolution )

抽象操作 PromiseResolve。引数 ctor (Object) および resolution (ECMAScript 言語値)。戻り値:(正常完了 (値:Object) または throw 完了)。 resolution で resolve された新しい promise を返します。 呼び出されると、次の手順を実行する。

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

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

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

  1. ctor を this 値とする。
  2. ctor が Object でない場合、TypeError 例外をスローする。
  3. status を Completion(Call(callback, undefined, args)) とする。
  4. status が中断完了である場合、
    1. promiseCapability を ? NewPromiseCapability(ctor) とする。
    2. ? Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] ») を実行する。
    3. promiseCapability.[[Promise]] を返す。
  5. そうでない場合、
    1. ? PromiseResolve(ctor, ! status) を返す。
注

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

27.5.4.9 Promise.withResolvers ( )

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

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

27.5.4.10 get Promise [ %Symbol.species% ]

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

  1. this 値を返す。

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

注

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

27.5.5 Promise Prototype オブジェクトのプロパティ

Promise prototype オブジェクトは:

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

27.5.5.1 Promise.prototype.catch ( onRejected )

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

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

27.5.5.2 Promise.prototype.constructor

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

27.5.5.3 Promise.prototype.finally ( onFinally )

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

  1. promise を this 値とする。
  2. promise が Object でない場合、TypeError 例外をスローする。
  3. ctor を ? SpeciesConstructor(promise, %Promise%) とする。
  4. 表明: IsConstructor(ctor) は true である。
  5. IsCallable(onFinally) が false である場合、
    1. thenFinally を onFinally とする。
    2. catchFinally を onFinally とする。
  6. そうでない場合、
    1. thenFinallyClosure を、onFinally と ctor を捕捉し、パラメーター (value) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(ctor, result) とする。
      3. returnValue を、value を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
        1. NormalCompletion(value) を返す。
      4. valueThunk を CreateBuiltinFunction(returnValue, 0, "", « ») とする。
      5. ? Invoke(p, "then", « valueThunk ») を返す。
    2. thenFinally を CreateBuiltinFunction(thenFinallyClosure, 1, "", « ») とする。
    3. catchFinallyClosure を、onFinally と ctor を捕捉し、パラメーター (reason) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
      1. result を ? Call(onFinally, undefined) とする。
      2. p を ? PromiseResolve(ctor, result) とする。
      3. throwReason を、reason を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
        1. reason をスローする。
      4. thrower を CreateBuiltinFunction(throwReason, 0, "", « ») とする。
      5. ? Invoke(p, "then", « thrower ») を返す。
    4. catchFinally を CreateBuiltinFunction(catchFinallyClosure, 1, "", « ») とする。
  7. ? Invoke(promise, "then", « thenFinally, catchFinally ») を返す。

27.5.5.4 Promise.prototype.then ( onFulfilled, onRejected )

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

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

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

抽象操作 PerformPromiseThen。引数 promise (Promise)、onFulfilled (ECMAScript 言語値) および onRejected (ECMAScript 言語値)および省略可能な引数 resultCapability (PromiseCapabilityレコード)。戻り値:(Object または undefined)。 onFulfilled および onRejected を settlement action として使用し、promise に対する「then」操作を実行します。resultCapability が渡された場合、結果は resultCapability の promise を更新することで保存されます。渡されていない場合、PerformPromiseThen は結果が重要でない仕様内部の操作から呼び出されています。 呼び出されると、次の手順を実行する。

  1. 表明: IsPromise(promise) は true である。
  2. resultCapability が存在しない場合、
    1. resultCapability を undefined に設定する。
  3. IsCallable(onFulfilled) が false である場合、
    1. onFulfilledJobCallback を empty とする。
  4. そうでない場合、
    1. onFulfilledJobCallback を HostMakeJobCallback(onFulfilled) とする。
  5. IsCallable(onRejected) が false である場合、
    1. onRejectedJobCallback を empty とする。
  6. そうでない場合、
    1. onRejectedJobCallback を HostMakeJobCallback(onRejected) とする。
  7. fulfillReaction を PromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: fulfill, [[Handler]]: onFulfilledJobCallback } とする。
  8. rejectReaction を PromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: reject, [[Handler]]: onRejectedJobCallback } とする。
  9. promise.[[PromiseState]] が pending である場合、
    1. fulfillReaction を promise.[[PromiseFulfillReactions]] に追加する。
    2. rejectReaction を promise.[[PromiseRejectReactions]] に追加する。
  10. そうでなく、promise.[[PromiseState]] が fulfilled である場合、
    1. value を promise.[[PromiseResult]] とする。
    2. fulfillJob を NewPromiseReactionJob(fulfillReaction, value) とする。
    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]) を実行する。
  11. そうでない場合、
    1. 表明: promise.[[PromiseState]] は rejected である。
    2. reason を promise.[[PromiseResult]] とする。
    3. promise.[[PromiseIsHandled]] が false である場合、HostPromiseRejectionTracker(promise, "handle") を実行する。
    4. rejectJob を NewPromiseReactionJob(rejectReaction, reason) とする。
    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]]) を実行する。
  12. promise.[[PromiseIsHandled]] を true に設定する。
  13. resultCapability が undefined である場合、undefined を返す。
  14. resultCapability.[[Promise]] を返す。

27.5.5.5 Promise.prototype [ %Symbol.toStringTag% ]

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

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

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

Promise インスタンスは Promise prototype オブジェクト(intrinsic %Promise.prototype%)からプロパティを継承する通常オブジェクトです。Promise インスタンスは、表 93 で説明される内部スロットを持つ状態で最初に作成されます。

表 93: Promise インスタンスの内部スロット
内部スロット 型 説明
[[PromiseState]] pending, fulfilled, or rejected promise がその then メソッドへの呼出しにどのように反応するかを制御します。
[[PromiseResult]] an ECMAScript language value or empty promise が fulfilled または rejected された値(存在する場合)。[[PromiseState]] が pending である場合に限り empty です。
[[PromiseFulfillReactions]] a List of PromiseReaction Records promise が pending 状態から fulfilled 状態へ遷移するとき/した場合に処理される Record。
[[PromiseRejectReactions]] a List of PromiseReaction Records promise が pending 状態から rejected 状態へ遷移するとき/した場合に処理される Record。
[[PromiseIsHandled]] a Boolean promise に fulfillment または rejection handler がこれまでに設定されたことがあるかどうかを示します。未処理の rejection の追跡に使用されます。

27.6 GeneratorFunction オブジェクト

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

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

27.6.1 GeneratorFunction コンストラクター

GeneratorFunction コンストラクターは:

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

27.6.1.1 GeneratorFunction ( ...paramArgs, bodyArg )

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

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

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

20.2.1.1 の注記を参照してください。

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

GeneratorFunction コンストラクターは:

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

27.6.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype の初期値は GeneratorFunction prototype オブジェクトです。

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

27.6.3 GeneratorFunction Prototype オブジェクトのプロパティ

GeneratorFunction prototype オブジェクトは:

27.6.3.1 GeneratorFunction.prototype.constructor

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

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

27.6.3.2 GeneratorFunction.prototype.prototype

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

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

27.6.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

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

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

27.6.4 GeneratorFunction インスタンス

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

各 GeneratorFunction インスタンスは次の own プロパティを持ちます。

27.6.4.1 length

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

27.6.4.2 name

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

27.6.4.3 prototype

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

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

注

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

27.7 AsyncGeneratorFunction オブジェクト

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

27.7.1 AsyncGeneratorFunction コンストラクター

AsyncGeneratorFunction コンストラクターは:

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

27.7.1.1 AsyncGeneratorFunction ( ...paramArgs, bodyArg )

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

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

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

20.2.1.1 の注記を参照してください。

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

AsyncGeneratorFunction コンストラクターは:

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

27.7.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype の初期値は AsyncGeneratorFunction prototype オブジェクトです。

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

27.7.3 AsyncGeneratorFunction Prototype オブジェクトのプロパティ

AsyncGeneratorFunction prototype オブジェクトは:

27.7.3.1 AsyncGeneratorFunction.prototype.constructor

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

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

27.7.3.2 AsyncGeneratorFunction.prototype.prototype

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

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

27.7.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

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

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

27.7.4 AsyncGeneratorFunction インスタンス

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

各 AsyncGeneratorFunction インスタンスは次の own プロパティを持ちます。

27.7.4.1 length

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

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

27.7.4.2 name

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

27.7.4.3 prototype

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

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

注

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

27.8 Generator オブジェクト

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

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

27.8.1 %GeneratorPrototype% オブジェクト

%GeneratorPrototype% オブジェクトは:

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

27.8.1.1 %GeneratorPrototype%.constructor

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

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

27.8.1.2 %GeneratorPrototype%.next ( value )

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

27.8.1.3 %GeneratorPrototype%.return ( value )

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

  1. gen を this 値とする。
  2. completion を ReturnCompletion(value) とする。
  3. ? GeneratorResumeAbrupt(gen, completion, empty) を返す。

27.8.1.4 %GeneratorPrototype%.throw ( exception )

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

  1. gen を this 値とする。
  2. completion を ThrowCompletion(exception) とする。
  3. ? GeneratorResumeAbrupt(gen, completion, empty) を返す。

27.8.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

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

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

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

Generator インスタンスは、表 94 で説明される内部スロットを持つ状態で最初に作成されます。

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

27.8.3 Generator の抽象操作

27.8.3.1 GeneratorStart ( gen, genBody )

抽象操作 GeneratorStart。引数 gen (Generator) および genBody ((a FunctionBody Parse Node または パラメーターを持たない抽象クロージャ))。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. 表明: gen.[[GeneratorState]] は suspended-start である。
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator component を gen に設定する。
  4. closure を、genBody を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGen を acGenContext の Generator component とする。
    3. genBody が Parse Node である場合、
      1. result を Completion(genBody の Evaluation) とする。
    4. そうでない場合、
      1. 表明: genBody はパラメーターを持たない Abstract Closure である。
      2. result を Completion(genBody()) とする。
    5. 表明: ここへ戻ってきた場合、generator は例外をスローしたか、暗黙または明示的な return のいずれかを実行した。
    6. acGenContext を実行コンテキストスタックから削除し、実行コンテキストスタックの先頭にある実行コンテキストを実行中の実行コンテキストとして復元する。
    7. acGen.[[GeneratorState]] を completed に設定する。
    8. 注記: generator が completed 状態に入ると、その状態から離れることはなく、関連付けられた実行コンテキストが再開されることもない。この時点で acGen に関連付けられたすべての実行状態を破棄できる。
    9. result がスロー完了である場合、
      1. resumption を result とする。
    10. そうでない場合、
      1. result が正常完了である場合、
        1. resultValue を undefined とする。
      2. そうでなく、result が return 完了である場合、
        1. resultValue を result.[[Value]] とする。
      3. resumption を NormalCompletion(CreateIteratorResultObject(resultValue, true)) とする。
    11. callerContext を実行中の実行コンテキストとする。
    12. resumption を渡して callerContext を再開する。
    13. 表明: この手順には決して到達しない。
  5. genContext のコード評価状態を、この実行コンテキストについて評価が再開されたとき、closure が引数なしで呼び出されるように設定する。
  6. gen.[[GeneratorContext]] を genContext に設定する。
  7. unused を返す。

27.8.3.2 GeneratorValidate ( gen, genBrand )

抽象操作 GeneratorValidate。引数 gen (ECMAScript 言語値) および genBrand ((String または empty))。戻り値:(正常完了 (値:(suspended-start、suspended-yield または completed)) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. ? RequireInternalSlot(gen, [[GeneratorState]]) を実行する。
  2. ? RequireInternalSlot(gen, [[GeneratorBrand]]) を実行する。
  3. gen.[[GeneratorBrand]] が genBrand でない場合、TypeError 例外をスローする。
  4. 表明: gen は [[GeneratorContext]] 内部スロットを持つ。
  5. state を gen.[[GeneratorState]] とする。
  6. state が executing である場合、TypeError 例外をスローする。
  7. state を返す。

27.8.3.3 GeneratorResume ( gen, value, genBrand )

抽象操作 GeneratorResume。引数 gen (ECMAScript 言語値)、value ((ECMAScript 言語値 または empty)) および genBrand ((String または empty))。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 呼び出されると、次の手順を実行する。

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

27.8.3.4 GeneratorResumeAbrupt ( gen, abruptCompletion, genBrand )

抽象操作 GeneratorResumeAbrupt。引数 gen (ECMAScript 言語値)、abruptCompletion ((return 完了 または throw 完了)) および genBrand ((String または empty))。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. state を ? GeneratorValidate(gen, genBrand) とする。
  2. state が suspended-start である場合、
    1. gen.[[GeneratorState]] を completed に設定する。
    2. 注記: generator が completed 状態に入ると、その状態から離れることはなく、関連付けられた実行コンテキストが再開されることもない。この時点で gen に関連付けられたすべての実行状態を破棄できる。
    3. state を completed に設定する。
  3. state が completed である場合、
    1. abruptCompletion が return 完了である場合、
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true) を返す。
    2. ? abruptCompletion を返す。
  4. 表明: state は suspended-yield である。
  5. genContext を gen.[[GeneratorContext]] とする。
  6. gen.[[GeneratorState]] を executing に設定する。
  7. ? RunSuspendedContext(genContext, abruptCompletion) を返す。

27.8.3.5 GetGeneratorKind ( )

抽象操作 GetGeneratorKind。引数なし。戻り値:(non-generator、sync または async)。 呼び出されると、次の手順を実行する。

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

27.8.3.6 GeneratorYield ( iteratorResult )

抽象操作 GeneratorYield。引数 iteratorResult (an Object that conforms to the IteratorResult interface)。戻り値:(正常完了 (値:ECMAScript 言語値) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. genContext を実行中の実行コンテキストとする。
  2. 表明: genContext は generator の実行コンテキストである。
  3. gen を genContext の Generator component の値とする。
  4. 表明: GetGeneratorKind() は sync である。
  5. gen.[[GeneratorState]] を suspended-yield に設定する。
  6. ? RunCallerContext(iteratorResult) を返す。

27.8.3.7 Yield ( arg )

抽象操作 Yield。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:ECMAScript 言語値) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. genKind を GetGeneratorKind() とする。
  2. genKind が async である場合、? AsyncGeneratorYield(? Await(arg)) を返す。
  3. ? GeneratorYield(CreateIteratorResultObject(arg, false)) を返す。

27.8.3.8 CreateIteratorFromClosure ( closure, genBrand, genProto [ , extraSlots ] )

抽象操作 CreateIteratorFromClosure。引数 closure (パラメーターを持たない抽象クロージャ)、genBrand ((String または empty)) および genProto (Object)および省略可能な引数 extraSlots (リスト (要素:内部スロット名))。戻り値:Generator。 呼び出されると、次の手順を実行する。

  1. 注記: closure は IteratorResult オブジェクトを yield するための Yield 操作の使用を含むことができる。
  2. extraSlots が存在しない場合、extraSlots を新しい空の List に設定する。
  3. internalSlotsList を extraSlots と « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] » のリスト連結とする。
  4. gen を OrdinaryObjectCreate(genProto, internalSlotsList) とする。
  5. gen.[[GeneratorBrand]] を genBrand に設定する。
  6. gen.[[GeneratorState]] を suspended-start に設定する。
  7. callerContext を実行中の実行コンテキストとする。
  8. calleeContext を新しい実行コンテキストとする。
  9. calleeContext の Function を null に設定する。
  10. calleeContext の Realm を現在の Realm Record に設定する。
  11. calleeContext の ScriptOrModule を callerContext の ScriptOrModule に設定する。
  12. callerContext がまだ一時停止されていない場合、callerContext を一時停止する。
  13. calleeContext を実行コンテキストスタックへ push する。calleeContext が実行中の実行コンテキストになる。
  14. GeneratorStart(gen, closure) を実行する。
  15. calleeContext を実行コンテキストスタックから削除し、callerContext を実行中の実行コンテキストとして復元する。
  16. gen を返す。

27.9 AsyncGenerator オブジェクト

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

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

27.9.1 %AsyncGeneratorPrototype% オブジェクト

%AsyncGeneratorPrototype% オブジェクトは:

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

27.9.1.1 %AsyncGeneratorPrototype%.constructor

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

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

27.9.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. gen を this 値とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. result を Completion(AsyncGeneratorValidate(gen, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. state を gen.[[AsyncGeneratorState]] とする。
  6. state が completed である場合、
    1. iteratorResult を CreateIteratorResultObject(undefined, true) とする。
    2. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
    3. promiseCapability.[[Promise]] を返す。
  7. completion を NormalCompletion(value) とする。
  8. AsyncGeneratorEnqueue(gen, completion, promiseCapability) を実行する。
  9. state が suspended-start または suspended-yield のいずれかである場合、
    1. AsyncGeneratorResume(gen, completion) を実行する。
  10. そうでない場合、
    1. 表明: state は executing または draining-queue のいずれかである。
  11. promiseCapability.[[Promise]] を返す。

27.9.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. gen を this 値とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. result を Completion(AsyncGeneratorValidate(gen, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. completion を ReturnCompletion(value) とする。
  6. AsyncGeneratorEnqueue(gen, completion, promiseCapability) を実行する。
  7. state を gen.[[AsyncGeneratorState]] とする。
  8. state が suspended-start または completed のいずれかである場合、
    1. gen.[[AsyncGeneratorState]] を draining-queue に設定する。
    2. AsyncGeneratorAwaitReturn(gen) を実行する。
  9. そうでなく、state が suspended-yield である場合、
    1. AsyncGeneratorResume(gen, completion) を実行する。
  10. そうでない場合、
    1. 表明: state は executing または draining-queue のいずれかである。
  11. promiseCapability.[[Promise]] を返す。

27.9.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. gen を this 値とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. result を Completion(AsyncGeneratorValidate(gen, empty)) とする。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. state を gen.[[AsyncGeneratorState]] とする。
  6. state が suspended-start である場合、
    1. gen.[[AsyncGeneratorState]] を completed に設定する。
    2. state を completed に設定する。
  7. state が completed である場合、
    1. ! Call(promiseCapability.[[Reject]], undefined, « exception ») を実行する。
    2. promiseCapability.[[Promise]] を返す。
  8. completion を ThrowCompletion(exception) とする。
  9. AsyncGeneratorEnqueue(gen, completion, promiseCapability) を実行する。
  10. state が suspended-yield である場合、
    1. AsyncGeneratorResume(gen, completion) を実行する。
  11. そうでない場合、
    1. 表明: state は executing または draining-queue のいずれかである。
  12. promiseCapability.[[Promise]] を返す。

27.9.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

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

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

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

AsyncGenerator インスタンスは、以下で説明される内部スロットを持つ状態で最初に作成されます。

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

27.9.3 AsyncGenerator の抽象操作

27.9.3.1 AsyncGeneratorRequest Record

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

次のフィールドを持ちます。

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

27.9.3.2 AsyncGeneratorStart ( gen, genBody )

抽象操作 AsyncGeneratorStart。引数 gen (AsyncGenerator) および genBody ((a FunctionBody Parse Node または パラメーターを持たない抽象クロージャ))。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. 表明: gen.[[AsyncGeneratorState]] は suspended-start である。
  2. genContext を実行中の実行コンテキストとする。
  3. genContext の Generator component を gen に設定する。
  4. closure を、genBody を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. acGenContext を実行中の実行コンテキストとする。
    2. acGen を acGenContext の Generator component とする。
    3. genBody が Parse Node である場合、
      1. result を Completion(genBody の Evaluation) とする。
    4. そうでない場合、
      1. 表明: genBody はパラメーターを持たない Abstract Closure である。
      2. result を Completion(genBody()) とする。
    5. 表明: ここへ戻ってきた場合、async generator は例外をスローしたか、暗黙または明示的な return のいずれかを実行した。
    6. acGenContext を実行コンテキストスタックから削除し、実行コンテキストスタックの先頭にある実行コンテキストを実行中の実行コンテキストとして復元する。
    7. acGen.[[AsyncGeneratorState]] を draining-queue に設定する。
    8. result が正常完了である場合、result を NormalCompletion(undefined) に設定する。
    9. result が return 完了である場合、result を NormalCompletion(result.[[Value]]) に設定する。
    10. AsyncGeneratorCompleteStep(acGen, result, true) を実行する。
    11. AsyncGeneratorDrainQueue(acGen) を実行する。
    12. callerContext を実行中の実行コンテキストとする。
    13. NormalCompletion(undefined) を渡して callerContext を再開する。
    14. 表明: この手順には決して到達しない。
  5. genContext のコード評価状態を、この実行コンテキストについて評価が再開されたとき、closure が引数なしで呼び出されるように設定する。
  6. gen.[[AsyncGeneratorContext]] を genContext に設定する。
  7. gen.[[AsyncGeneratorQueue]] を新しい空の List に設定する。
  8. unused を返す。

27.9.3.3 AsyncGeneratorValidate ( gen, genBrand )

抽象操作 AsyncGeneratorValidate。引数 gen (ECMAScript 言語値) および genBrand ((String または empty))。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. ? RequireInternalSlot(gen, [[AsyncGeneratorContext]]) を実行する。
  2. ? RequireInternalSlot(gen, [[AsyncGeneratorState]]) を実行する。
  3. ? RequireInternalSlot(gen, [[AsyncGeneratorQueue]]) を実行する。
  4. gen.[[GeneratorBrand]] が genBrand でない場合、TypeError 例外をスローする。
  5. unused を返す。

27.9.3.4 AsyncGeneratorEnqueue ( gen, completion, promiseCapability )

抽象操作 AsyncGeneratorEnqueue。引数 gen (AsyncGenerator)、completion (完了レコード) および promiseCapability (PromiseCapabilityレコード)。戻り値:unused。 呼び出されると、次の手順を実行する。

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

27.9.3.5 AsyncGeneratorCompleteStep ( gen, completion, done [ , realm ] )

抽象操作 AsyncGeneratorCompleteStep。引数 gen (AsyncGenerator)、completion (完了レコード) および done (Boolean)および省略可能な引数 realm (Realmレコード)。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. 表明: gen.[[AsyncGeneratorQueue]] は空でない。
  2. next を gen.[[AsyncGeneratorQueue]] の最初の要素とする。
  3. gen.[[AsyncGeneratorQueue]] から最初の要素を削除する。
  4. promiseCapability を next.[[Capability]] とする。
  5. value を completion.[[Value]] とする。
  6. completion がスロー完了である場合、
    1. ! Call(promiseCapability.[[Reject]], undefined, « value ») を実行する。
  7. そうでない場合、
    1. 表明: completion は正常完了である。
    2. realm が存在する場合、
      1. oldRealm を実行中の実行コンテキストの Realm とする。
      2. 実行中の実行コンテキストの Realm を realm に設定する。
      3. iteratorResult を CreateIteratorResultObject(value, done) とする。
      4. 実行中の実行コンテキストの Realm を oldRealm に設定する。
    3. そうでない場合、
      1. iteratorResult を CreateIteratorResultObject(value, done) とする。
    4. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する。
  8. unused を返す。

27.9.3.6 AsyncGeneratorResume ( gen, completion )

抽象操作 AsyncGeneratorResume。引数 gen (AsyncGenerator) および completion (完了レコード)。戻り値:unused。 呼び出されると、次の手順を実行する。

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

27.9.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

抽象操作 AsyncGeneratorUnwrapYieldResumption。引数 resumptionValue (完了レコード)。戻り値:(正常完了 (値:ECMAScript 言語値) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. resumptionValue が return 完了でない場合、? resumptionValue を返す。
  2. awaited を Completion(Await(resumptionValue.[[Value]])) とする。
  3. awaited がスロー完了である場合、? awaited を返す。
  4. 表明: awaited は正常完了である。
  5. ReturnCompletion(awaited.[[Value]]) を返す。

27.9.3.8 AsyncGeneratorYield ( arg )

抽象操作 AsyncGeneratorYield。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:ECMAScript 言語値) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. genContext を実行中の実行コンテキストとする。
  2. 表明: genContext は generator の実行コンテキストである。
  3. gen を genContext の Generator component の値とする。
  4. 表明: GetGeneratorKind() は async である。
  5. completion を NormalCompletion(arg) とする。
  6. 表明: 実行コンテキストスタックは少なくとも2つの要素を持つ。
  7. previousContext を実行コンテキストスタックの上から2番目の要素とする。
  8. previousRealm を previousContext の Realm とする。
  9. AsyncGeneratorCompleteStep(gen, completion, false, previousRealm) を実行する。
  10. queue を gen.[[AsyncGeneratorQueue]] とする。
  11. queue が空でない場合、
    1. 注記: 実行は generator を一時停止せずに継続する。
    2. toYield を queue の最初の要素とする。
    3. resumptionValue を Completion(toYield.[[Completion]]) とする。
    4. ? AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。
  12. gen.[[AsyncGeneratorState]] を suspended-yield に設定する。
  13. resumptionValue を Completion(RunCallerContext(undefined)) とする。
  14. ? AsyncGeneratorUnwrapYieldResumption(resumptionValue) を返す。

27.9.3.9 AsyncGeneratorAwaitReturn ( gen )

抽象操作 AsyncGeneratorAwaitReturn。引数 gen (AsyncGenerator)。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. 表明: gen.[[AsyncGeneratorState]] は draining-queue である。
  2. queue を gen.[[AsyncGeneratorQueue]] とする。
  3. 表明: queue は空でない。
  4. next を queue の最初の要素とする。
  5. completion を Completion(next.[[Completion]]) とする。
  6. 表明: completion は return 完了である。
  7. promiseCompletion を Completion(PromiseResolve(%Promise%, completion.[[Value]])) とする。
  8. promiseCompletion が中断完了である場合、
    1. AsyncGeneratorCompleteStep(gen, promiseCompletion, true) を実行する。
    2. AsyncGeneratorDrainQueue(gen) を実行する。
    3. unused を返す。
  9. 表明: promiseCompletion は正常完了である。
  10. promise を promiseCompletion.[[Value]] とする。
  11. fulfilledClosure を、gen を捕捉し、パラメーター (value) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. 表明: gen.[[AsyncGeneratorState]] は draining-queue である。
    2. result を NormalCompletion(value) とする。
    3. AsyncGeneratorCompleteStep(gen, result, true) を実行する。
    4. AsyncGeneratorDrainQueue(gen) を実行する。
    5. NormalCompletion(undefined) を返す。
  12. onFulfilled を CreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  13. rejectedClosure を、gen を捕捉し、パラメーター (reason) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. 表明: gen.[[AsyncGeneratorState]] は draining-queue である。
    2. result を ThrowCompletion(reason) とする。
    3. AsyncGeneratorCompleteStep(gen, result, true) を実行する。
    4. AsyncGeneratorDrainQueue(gen) を実行する。
    5. NormalCompletion(undefined) を返す。
  14. onRejected を CreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  15. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  16. unused を返す。

27.9.3.10 AsyncGeneratorDrainQueue ( gen )

抽象操作 AsyncGeneratorDrainQueue。引数 gen (AsyncGenerator)。戻り値:unused。 return 完了を保持する AsyncGeneratorRequest に遭遇するまで、generator の AsyncGeneratorQueue を空にしていきます。 呼び出されると、次の手順を実行する。

  1. 表明: gen.[[AsyncGeneratorState]] は draining-queue である。
  2. queue を gen.[[AsyncGeneratorQueue]] とする。
  3. queue が空でない間、次を繰り返す。
    1. next を queue の最初の要素とする。
    2. completion を Completion(next.[[Completion]]) とする。
    3. completion が return 完了である場合、
      1. AsyncGeneratorAwaitReturn(gen) を実行する。
      2. unused を返す。
    4. completion が正常完了である場合、
      1. completion を NormalCompletion(undefined) に設定する。
    5. AsyncGeneratorCompleteStep(gen, completion, true) を実行する。
  4. gen.[[AsyncGeneratorState]] を completed に設定する。
  5. unused を返す。

27.10 AsyncFunction オブジェクト

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

27.10.1 AsyncFunction コンストラクター

AsyncFunction コンストラクターは:

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

27.10.1.1 AsyncFunction ( ...paramArgs, bodyArg )

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

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

  1. activeFunc をアクティブな関数オブジェクトとする。
  2. bodyArg が存在しない場合、bodyArg を空の String に設定する。
  3. ? CreateDynamicFunction(activeFunc, NewTarget, async, paramArgs, bodyArg) を返す。
注
20.2.1.1 の注記を参照してください。

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

AsyncFunction コンストラクターは:

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

27.10.2.1 AsyncFunction.prototype

AsyncFunction.prototype の初期値は AsyncFunction prototype オブジェクトです。

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

27.10.3 AsyncFunction Prototype オブジェクトのプロパティ

AsyncFunction prototype オブジェクトは:

27.10.3.1 AsyncFunction.prototype.constructor

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

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

27.10.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

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

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

27.10.4 AsyncFunction インスタンス

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

各 AsyncFunction インスタンスは次の own プロパティを持ちます。

27.10.4.1 length

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

27.10.4.2 name

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

27.10.5 Async Function の抽象操作

27.10.5.1 AsyncFunctionStart ( promiseCapability, asyncFuncBody )

抽象操作 AsyncFunctionStart。引数 promiseCapability (PromiseCapabilityレコード) および asyncFuncBody ((a FunctionBody Parse Node、an ExpressionBody Parse Node または パラメーターを持たない抽象クロージャ))。戻り値:unused。 呼び出されると、次の手順を実行する。

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

27.10.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

抽象操作 AsyncBlockStart。引数 promiseCapability (PromiseCapabilityレコード)、asyncBody ((構文解析ノード または パラメーターを持たない抽象クロージャ)) および asyncContext (実行コンテキスト)。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. closure を、promiseCapability と asyncBody を捕捉し、パラメーターを持たず、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. acAsyncContext を実行中の実行コンテキストとする。
    2. asyncBody が Parse Node である場合、
      1. result を Completion(asyncBody の Evaluation) とする。
    3. そうでない場合、
      1. 表明: asyncBody はパラメーターを持たない Abstract Closure である。
      2. result を Completion(asyncBody()) とする。
    4. 表明: ここへ戻ってきた場合、async function は例外をスローしたか、暗黙または明示的な return を実行した。すべての await は完了している。
    5. acAsyncContext を実行コンテキストスタックから削除し、実行コンテキストスタックの先頭にある実行コンテキストを実行中の実行コンテキストとして復元する。
    6. result が正常完了である場合、
      1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行する。
    7. そうでなく、result が return 完了である場合、
      1. ! Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] ») を実行する。
    8. そうでない場合、
      1. 表明: result はスロー完了である。
      2. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») を実行する。
    9. callerContext を実行中の実行コンテキストとする。
    10. NormalCompletion(unused) を渡して callerContext を再開する。
    11. 表明: この手順には決して到達しない。
  2. asyncContext のコード評価状態を、この実行コンテキストについて評価が再開されたとき、closure が引数なしで呼び出されるように設定する。
  3. result を ! RunSuspendedContext(asyncContext, NormalCompletion(empty)) とする。
  4. 表明: result は unused である。
  5. 注記: result 値の可能な発生源は Await、または async function が何も await しない場合は上記の手順 1.j である。
  6. unused を返す。

27.10.5.3 Await ( arg )

抽象操作 Await。引数 arg (ECMAScript 言語値)。戻り値:(正常完了 (値:(ECMAScript 言語値 または empty)) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. asyncContext を実行中の実行コンテキストとする。
  2. promise を ? PromiseResolve(%Promise%, arg) とする。
  3. fulfilledClosure を、asyncContext を捕捉し、パラメーター (value) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. Completion(RunSuspendedContext(asyncContext, NormalCompletion(value))) を実行する。
    2. 注記: RunSuspendedContext が返す Completion Record は意図的に無視される。
    3. NormalCompletion(undefined) を返す。
  4. onFulfilled を CreateBuiltinFunction(fulfilledClosure, 1, "", « ») とする。
  5. rejectedClosure を、asyncContext を捕捉し、パラメーター (reason) を持ち、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. Completion(RunSuspendedContext(asyncContext, ThrowCompletion(reason))) を実行する。
    2. 注記: RunSuspendedContext が返す Completion Record は意図的に無視される。
    3. NormalCompletion(undefined) を返す。
  6. onRejected を CreateBuiltinFunction(rejectedClosure, 1, "", « ») とする。
  7. PerformPromiseThen(promise, onFulfilled, onRejected) を実行する。
  8. ? RunCallerContext(empty) を返す。