25.1 反復(Iteration)
25.1.1 共通反復インターフェース(Common Iteration Interfaces)
インターフェイスは、関連付けられた値が特定の仕様に一致するプロパティキーのセットです。 インターフェイス仕様の全てのプロパティを提供するオブジェクトは、そのインターフェイスに準拠している、と言えます。 インターフェイスは、特定のオブジェクトによって表されません。 特定のインターフェースに準拠するオブジェクトが多数存在する場合があります。 一つのオブジェクトで、複数のインターフェイスに準拠する場合もあります。
25.1.1.1 Iterableインターフェース(The Iterable Interface)
Iterableインターフェースには、表65で説明されているプロパティがあります。
プロパティ | 値 | 要件 |
---|---|---|
@@iterator | Iteratorオブジェクトを返す関数。 | 返されるオブジェクトは、Iteratorインターフェースに準拠している必要があります。 |
25.1.1.2 Iteratorインターフェイス(The Iterator Interface)
Iteratorインターフェースを実装するオブジェクトには、表66のプロパティが必要です。オプションで、表67のプロパティも実装できます。
プロパティ | 値 | 要件 |
---|---|---|
"next" | IteratorResultオブジェクトを返す関数 | 返されるオブジェクトは、IteratorResultインターフェイスに準拠している必要があります。 Iteratorのnextメソッド呼び出しの結果、IteratorResultオブジェクトの"done"プロパティがtrueだった場合、以降のnextメソッド呼び出し結果も、"done"プロパティがtrueである必要があります。 ただし、この要件は強制されません。 |
プロパティ | 値 | 要件 |
---|---|---|
"return" | IteratorResultオブジェクトを返す関数。 | 返されるオブジェクトは、IteratorResultインターフェイスに準拠している必要があります。 このメソッドを呼び出すと、今後nextメソッド呼び出しを行う予定がないことがIteratorオブジェクトに通知されます。 通常、返されるIteratorResultオブジェクトには、値がtrueの"done"プロパティと、returnメソッドの引数として渡した値がセットされた "value"プロパティがあります。 ただし、この要件は強制されません。 |
"throw" | IteratorResultオブジェクトを返す関数。 | 返されるオブジェクトは、IteratorResultインターフェイスに準拠している必要があります。 このメソッドを呼び出すと、呼び出し元がエラー状態を検出したことがIteratorオブジェクトに通知されます。 引数はエラー状態を識別するために使用でき、通常は例外オブジェクトになります。 一般的にはメソッド内で、引数として渡された値をスローします。 メソッドがスローしない場合、返されるIteratorResultオブジェクトには通常、値がtrueの"done"プロパティがあります |
25.1.1.3 AsyncIterableインターフェース(The AsyncIterable Interface)
AsyncIterableインターフェイスには、表68のプロパティがあります。
プロパティ | 値 | 要件 |
---|---|---|
@@asyncIterator | AsyncIteratorオブジェクトを返す関数 | 返されるオブジェクトは、AsyncIteratorインターフェイスに準拠している必要があります |
25.1.1.4 AsyncIteratorインターフェース(The AsyncIterator Interface)
AsyncIteratorインターフェイスを実装するオブジェクトには、表69のプロパティがあります。オプションとして、表70のプロパティも実装できます。
プロパティ | 値 | 要件 |
---|---|---|
"next" | IteratorResultオブジェクトのpromiseを返す関数。 | 返されるpromiseは、fulfilled時、IteratorResultインターフェイスに準拠するオブジェクトでfulfillされる必要があります。 nextメソッドへの前の呼び出し結果のpromiseの"done"プロパティがtrueの場合、以後のnextメソッドの結果も、"done"の値がtrueである必要があります。 ただし、この要件は強制されません。 |
プロパティ | 値 | 要件 |
---|---|---|
"return" | IteratorResultオブジェクトのpromiseを返す関数 | 返されるpromiseは、fulfilled時、IteratorResultインターフェイスに準拠するオブジェクトでfulfillされる必要があります。 このメソッドを呼び出すと、今後nextメソッド呼び出しを行う予定がないことをAsyncIteratorオブジェクトに通知します。返されるpromiseは、通常、値がtrueの"done"プロパティと、値がreturnメソッドの引数に渡した値である"value"プロパティを持つIteratorResultオブジェクトでfulfillされます。 ただし、この要件は強制されません。
さらに、fulfillment値として機能するIteratorResultオブジェクトには、値がpromise(または"thenable")ではない"value"プロパティが必要です。 引数値が通常の方法で使用されていて、rejectされたpromiseである場合、同じ理由で拒否されたpromiseが返されます。 それがfulfilledされたpromiseである場合、そのfulfillment値を、返されるPromiseのIteratorResultオブジェクトのfulfillmentの"value"プロパティとして使用する必要があります。 ただし、これらの要件も適用されません。 |
"throw" | IteratorResultオブジェクトのpromiseを返す関数 | 返されるpromiseはfulfilled時、IteratorResultインターフェイス に準拠するオブジェクトでfulfillされる必要があります。 このメソッドを呼び出すと、呼び出し元がエラー状態を検出したことがAsyncIteratorオブジェクトに通知されます。 引数はエラー状態を識別するために使用でき、通常は例外オブジェクトになります。 一般的には、引数として渡された値でrejectするrejectedされたpromiseを返します。返されたpromiseがfulfilledされると、IteratorResultのfulfill値には通常、値がtrueの"done"プロパティが含まれます。 さらに、値がpromise(または"thenable")ではない"value"プロパティが必要です。ただし、この要件は強制されません。 |
25.1.1.5 IteratorResultインターフェース(The IteratorResult Interface)
IteratorResultインターフェイスには、表71のプロパティがあります。
プロパティ | 値 | 要件 |
---|---|---|
"done" | trueまたはfalse | iteratorのnextメソッド呼び出し結果ステータスです。 反復の終わりに達した場合、"done"プロパティがtrueになります。 終わりに達していない場合、"done"はfalseで、"value"が使用可能です。 所有または継承された"done"プロパティが存在しない場合、falseと見なされます。 |
"value" | ECMAScript言語値 | "done"がfalseの場合、現在の反復要素の値です。 "done"がtrueの場合、反復の戻り値です。 反復の戻り値がない場合、値はundefinedです。 このとき、明示的に"value"プロパティを継承していないと、"value"プロパティが存在しない可能性があります。 |
25.1.2 %IteratorPrototype%オブジェクト(The %IteratorPrototype% Object)
%IteratorPrototype%オブジェクトは、次の特徴があります。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- 通常のオブジェクトです。
この仕様で定義されている、Iteratorインターフェースを実装するオブジェクトは、%IteratorPrototype% からも継承します。 ECMAScriptコードが、%IteratorPrototype% から継承するオブジェクトを定義する場合もあります。 %IteratorPrototype% オブジェクトは、すべてのイテレーターオブジェクトに適用可能なメソッドを追加できる場所を提供します。
次の式は、ECMAScriptコードが%IteratorPrototype%オブジェクトにアクセスする方法の一例です。
Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))
25.1.2.1 %IteratorPrototype% [ @@iterator ] ( )
次の手順が実行されます。
- this値 を返す
この関数の"name"プロパティの値は"[Symbol.iterator]"です。
25.1.3 %AsyncIteratorPrototype%オブジェクト(The %AsyncIteratorPrototype% Object)
%AsyncIteratorPrototype%は、次の特徴があります。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- 通常のオブジェクトです。
25.1.3.1 %AsyncIteratorPrototype% [ @@asyncIterator ] ( )
次の手順が実行されます。
- this値 を返す
この関数の"name"プロパティの値は"[Symbol.iterator]"です。
25.1.4 Async-from-Syncイテレーターオブジェクト(Async-from-Sync Iterator Objects)
Async-from-Syncイテレーターオブジェクトは、特定の同期イテレーターを適応させる非同期イテレーターです。 Async-from-SyncIteratorオブジェクトに名前付きコンストラクターはありません。 代わりに、CreateAsyncFromSyncIterator抽象操作によって作成されます。
25.1.4.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )
抽象操作CreateAsyncFromSyncIteratorは、同期イテレーターレコードから非同期イテレーターレコードを作成するために使用されます。 次の手順を実行します。
- ! OrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] ») を asyncIterator とする
- syncIteratorRecord を asyncIterator.[[SyncIteratorRecord]] にセットする
- ! Get(asyncIterator, "next") を nextMethod とする
- Record { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false } を iteratorRecord とする
- iteratorRecord を返す
25.1.4.2 %AsyncFromSyncIteratorPrototype%オブジェクト(The %AsyncFromSyncIteratorPrototype% Object)
%AsyncFromSyncIteratorPrototype%は、次の特徴があります。
- すべてのAsync-from-Syncイテレータオブジェクトが継承するプロパティがあります。
- 通常のオブジェクトです。
- [[Prototype]]内部スロットがあり、値は%AsyncIteratorPrototype%です。
- 以下のプロパティがあります。
25.1.4.2.1 %AsyncFromSyncIteratorPrototype%.next ( value )
- this値 を O とする
- Assert: Type(O) は Object型 で O は [[SyncIteratorRecord]] 内部スロットがある
- ! NewPromiseCapability(%Promise%) を promiseCapability とする
- O.[[SyncIteratorRecord]] を syncIteratorRecord とする
- IteratorNext(syncIteratorRecord, value) を result とする
- IfAbruptRejectPromise(result, promiseCapability)
- ! AsyncFromSyncIteratorContinuation(result, promiseCapability) を返す
25.1.4.2.2 %AsyncFromSyncIteratorPrototype%.return ( value )
- this値 を O とする
- Assert: Type(O) は Object型 で O は [[SyncIteratorRecord]] 内部スロットがある
- ! NewPromiseCapability(%Promise%) を promiseCapability とする
- O.[[SyncIteratorRecord]].[[Iterator]] を syncIterator とする
- GetMethod(syncIterator, "return") を return とする
- IfAbruptRejectPromise(return, promiseCapability)
- return が undefined なら、
- Call(return, syncIterator, « value ») を result とする
- IfAbruptRejectPromise(result, promiseCapability)
- Type(result) が Object型 でないなら、
- ! AsyncFromSyncIteratorContinuation(result, promiseCapability) を返す
25.1.4.2.3 %AsyncFromSyncIteratorPrototype%.throw ( value )
- this値 を O とする
- Assert: Type(O) は Object型 で O は [[SyncIteratorRecord]] 内部スロットがある
- ! NewPromiseCapability(%Promise%) を promiseCapability とする
- O.[[SyncIteratorRecord]].[[Iterator]] を syncIterator とする
- GetMethod(syncIterator, "throw") を throw とする
- IfAbruptRejectPromise(throw, promiseCapability)
- throw が undefined なら、
- Call(throw, syncIterator, « value ») を result とする
- IfAbruptRejectPromise(result, promiseCapability)
- Type(result) が Object型 でないなら、
- ! AsyncFromSyncIteratorContinuation(result, promiseCapability) を返す
25.1.4.2.4 Async-from-Syncイテレータ値アンラップ関数(Async-from-Sync Iterator Value Unwrap Functions)
async-from-syncイテレータ値アンラップ関数は、IteratorResultオブジェクトの"value"プロパティを処理時に、AsyncFromSyncIteratorContinuationによって使用される匿名の組み込み関数です。そして、promiseの場合はその値を待機して再パッケージ化します。 結果は、新しい"ラップされていない"IteratorResultオブジェクトになります。 各async-from-syncイテレータ値アンラップ関数には[[Done]]内部スロットがあります。
async-from-syncイテレータ値アンラップ関数が引数valueを使用して呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- ! CreateIterResultObject(value, F.[[Done]]) を返す
25.1.4.3 Async-from-Syncイテレータインスタンスのプロパティ(Properties of Async-from-Sync Iterator Instances)
Async-from-Syncイテレータインスタンスは、%AsyncFromSyncIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクトです。このインスタンスは、最初に表72の内部スロットが作成されます。Async-from-SyncIteratorインスタンスは、ECMAScriptコードから直接アクセスできません。
内部スロット | 意味 |
---|---|
[[SyncIteratorRecord]] | GetIteratorによって返されるレコードで、元の同期イテレーターを表します。 |
25.1.4.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability )
- IteratorComplete(result) を done とする
- IfAbruptRejectPromise(done, promiseCapability)
- IteratorValue(result) を value とする
- IfAbruptRejectPromise(value, promiseCapability)
- PromiseResolve(%Promise%, value) を valueWrapper とする
- IfAbruptRejectPromise(valueWrapper, promiseCapability)
- Async-from-Syncイテレータ値アンラップ関数のアルゴリズムを steps とする
- ! CreateBuiltinFunction(steps, « [[Done]] ») を onFulfilled とする
- done を onFulfilled.[[Done]] にセットする
- ! PerformPromiseThen(valueWrapper, onFulfilled, undefined, promiseCapability) を実行する
- promiseCapability.[[Promise]] を返す
25.2 GeneratorFunctionオブジェクト(GeneratorFunction Objects)
GeneratorFunctionオブジェクトは、通常、GeneratorDeclaration、GeneratorExpression、およびGeneratorMethodを評価することで作成される関数です。 また、%GeneratorFunction%組み込み関数を呼び出すことで作成することもできます。
25.2.1 GeneratorFunctionコンストラクター(The GeneratorFunction Constructor)
GeneratorFunctionコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%GeneratorFunction%です。
- 関数として呼び出されたときに、新しいGeneratorFunctionオブジェクトを作成して初期化します。 したがって、関数呼び出しGeneratorFunction(…)は、同じ引数を持つオブジェクト作成式new GeneratorFunction(…)と同等です。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、super呼び出しを含めて、組み込みのGeneratorFunction動作に必要な内部スロットでサブクラスインスタンスを作成および初期化する必要があります。 ジェネレーター関数オブジェクトを定義するためのすべてのECMAScript構文形式は、GeneratorFunctionの直接インスタンスを作成します。 GeneratorFunctionサブクラスのインスタンスを作成するための構文上の手段はありません。
25.2.1.1 GeneratorFunction ( p1, p2, … , pn, body )
最後の引数は、ジェネレーター関数の本体(実行可能コード)を指定します。 先行する引数はすべて仮パラメーターを指定します。
GeneratorFunction関数がいくつかの引数p1、p2、…、pn、body(またはnが0の場合、つまりp引数がなく、bodyもない)で呼び出されると、次の手順を実行します。
- アクティブ関数オブジェクト を C とする
- [[Call]]または[[Construct]]によって関数に渡されたargumentsList を args とする
- ? CreateDynamicFunction(C, NewTarget, generator, args) を返す
25.2.2 GeneratorFunctionコンストラクターのプロパティ(Properties of the GeneratorFunction Constructor)
GeneratorFunctionコンストラクターは、次の特徴があります。
- Functionコンストラクターから継承する標準の組み込み関数オブジェクトです。
- [[Prototype]]内部スロットがあり、値は%Function%です。
- "name"プロパティがあり、値は"GeneratorFunction"です。
- 以下のプロパティがあります。
25.2.2.1 GeneratorFunction.length
これは、値が1のデータプロパティです。
このプロパティの属性は、 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.2.2.2 GeneratorFunction.prototype
GeneratorFunction.prototypeの初期値は%Generator%です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。
25.2.3 GeneratorFunctionプロトタイプオブジェクトのプロパティ(Properties of the GeneratorFunction Prototype Object)
GeneratorFunctionプロトタイプオブジェクトは、次の特徴があります。
- 通常のオブジェクトです。
- 関数オブジェクトではありません。[[ECMAScriptCode]]内部スロットまたは表27または表73にリストされている内部スロットを持っていません。
- %GeneratorFunction%の"prototype"プロパティの値です。
- 組み込みオブジェクト%Generator%です(図2を参照)。
- [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
25.2.3.1 GeneratorFunction.prototype.constructor
GeneratorFunction.prototype.constructorの初期値は%GeneratorFunction%です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.2.3.2 GeneratorFunction.prototype.prototype
GeneratorFunction.prototype.prototypeの値は、%Generator.prototype%組み込みオブジェクトです。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.2.3.3 GeneratorFunction.prototype [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"GeneratorFunction"です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.2.4 GeneratorFunctionインスタンス(GeneratorFunction Instances)
GeneratorFunctionインスタンスはECMAScript関数オブジェクトで、表27にリストされている内部スロットがあります。また、[[IsClassConstructor]]内部スロットの値はfalseです。
各GeneratorFunctionインスタンスには、以下の独自プロパティがあります。
25.2.4.1 length
Functionインスタンスの"length"プロパティの仕様(19.2.4.1)が適用されます。
25.2.4.2 name
Functionインスタンスの"name"プロパティの仕様(19.2.4.2)が適用されます。
25.2.4.3 prototype
GeneratorFunctionインスタンスが作成されるたびに、通常のオブジェクトが作成され、ジェネレーター関数の"prototype"プロパティの初期値になります。ジェネレーター関数オブジェクトが[[Call]]を使用して呼び出されたとき、新しく作成されたジェネレーターオブジェクトの[[Prototype]]内部スロットを初期化するために "prototype"プロパティの値が使用されます。
このプロパティの属性は{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }です。
25.3 AsyncGeneratorFunctionオブジェクト(AsyncGeneratorFunction Objects)
AsyncGeneratorFunctionオブジェクトは、通常、AsyncGeneratorDeclaration、AsyncGeneratorExpression、およびAsyncGeneratorMethodの構文プロダクションを評価することによって作成される関数です。 また、%AsyncGeneratorFunction%組み込み関数を呼び出すことによって作成することもできます。
25.3.1 AsyncGeneratorFunctionコンストラクター(The AsyncGeneratorFunction Constructor)
AsyncGeneratorFunctionコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%AsyncGeneratorFunction%です。
- 関数として呼び出されたときに、新しいAsyncGeneratorFunctionオブジェクトを作成して初期化します。 したがって、関数呼び出しAsyncGeneratorFunction(...)は、同じ引数を持つオブジェクト作成式new AsyncGeneratorFunction(...)と同等です。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、組み込みのAsyncGeneratorFunction動作に必要な内部スロットでサブクラスインスタンスを作成および初期化するためにsuper呼び出しを含める必要があります。 非同期ジェネレーター関数オブジェクトを定義するためのすべてのECMAScript構文形式は、AsyncGeneratorFunctionの直接インスタンスを作成します。 AsyncGeneratorFunctionサブクラスのインスタンスを作成する構文上の手段はありません。
25.3.1.1 AsyncGeneratorFunction ( p1, p2, … , pn, body )
最後の引数は、非同期ジェネレーター関数の本体(実行可能コード)を指定します。 先行する引数はすべて仮パラメーターを指定します。
AsyncGeneratorFunction関数がいくつかの引数p1、p2、…、pn、body(またはnが0の場合、つまりp引数がなく、bodyも提供されない)で呼び出されたとき、次の手順を実行します。
- アクティブ関数オブジェクト を C とする
- [[Call]]または[[Construct]]によって関数に渡されたargumentsList を args とする
- ? CreateDynamicFunction(C, NewTarget, asyncGenerator, args) を返す
25.3.2 AsyncGeneratorFunctionコンストラクターのプロパティ(Properties of the AsyncGeneratorFunction Constructor)
AsyncGeneratorFunctionコンストラクターは、次の特徴があります。
- Functionコンストラクターから継承する標準の組み込み関数オブジェクトです。
- [[Prototype]]内部スロットがあり、値は%Function%です。
- "name"プロパティがあり、値は "AsyncGeneratorFunction"です。
- 以下のプロパティがあります。
25.3.2.1 AsyncGeneratorFunction.length
値が1のデータプロパティです。
このプロパティの属性は、{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.3.2.2 AsyncGeneratorFunction.prototype
AsyncGeneratorFunction.prototypeの初期値は、組み込みオブジェクト%AsyncGenerator%です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。
25.3.3 AsyncGeneratorFunctionプロトタイプオブジェクトのプロパティ(Properties of the AsyncGeneratorFunction Prototype Object)
AsyncGeneratorFunctionプロトタイプオブジェクトは、次の特徴があります。
- 通常のオブジェクトです。
- 関数オブジェクトではありません。[[ECMAScriptCode]]内部スロットまたは表27または表74にリストされている内部スロットを持っていません。
- %AsyncGeneratorFunction%の"prototype"プロパティの値です。
- %AsyncGenerator%です。
- [[Prototype]]内部スロットがあり、値がは%Function.prototype%です。
25.3.3.1 AsyncGeneratorFunction.prototype.constructor
AsyncGeneratorFunction.prototype.constructorの初期値は%AsyncGeneratorFunction%です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.3.3.2 AsyncGeneratorFunction.prototype.prototype
AsyncGeneratorFunction.prototype.prototypeの値は、%AsyncGenerator.prototype%組み込みオブジェクトです。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.3.3.3 AsyncGeneratorFunction.prototype [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"AsyncGeneratorFunction"です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.3.4 AsyncGeneratorFunctionインスタンス(AsyncGeneratorFunction Instances)
すべてのAsyncGeneratorFunctionインスタンスはECMAScript関数オブジェクトであり、表27にリストされている内部スロットがあります。また[[IsClassConstructor]]内部スロットの値はfalseです。
各AsyncGeneratorFunctionインスタンスには、次の独自プロパティがあります。
25.3.4.1 length
"length"プロパティの値は、引数として期待される数を示す整数です。 ただし、この言語では、異なる数の引数で関数を呼び出すことができます。 "length"プロパティで指定された数以外の数の引数で呼び出されたときのAsyncGeneratorFunctionの動作は、関数によって異なります。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.3.4.2 name
Functionインスタンスの"name"プロパティの仕様(19.2.4.2)が、適用されます。
25.3.4.3 prototype
AsyncGeneratorFunctionインスタンスが作成されるたびに、通常のオブジェクトが作成され、非同期ジェネレーター関数の"prototype"プロパティの初期値になります。[[Call]]を使用してジェネレーター関数オブジェクトが呼び出されたとき、、新しく作成されたAsyncGeneratorオブジェクトの[[Prototype]]内部スロットを初期化するために "prototype"プロパティの値が使用されます。
このプロパティの属性は{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }です。
25.4 Generatorオブジェクト(Generator Objects)
Generatorオブジェクトは、ジェネレーター関数のインスタンスであり、IteratorインターフェースとIterableインターフェースの両方に準拠しています。
Generatorインスタンスは、インスタンスを作成したジェネレータ関数の"prototype"プロパティからプロパティを直接継承します。 Generatorインスタンスは、Generatorプロトタイプの組み込み%Generator.prototype%からプロパティを間接的に継承します。
25.4.1 Generatorプロトタイプオブジェクトのプロパティ(Properties of the Generator Prototype Object)
Generatorプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%GeneratorPrototype%です。
- %Generator%の"prototype"プロパティ(GeneratorFunction.prototype)の初期値です。
- 通常のオブジェクトです。
- Generatorインスタンスではありません。[[GeneratorState]]内部スロットがありません。
- [[Prototype]]内部スロットがあり、値は%IteratorPrototype%です。
- すべてのGeneratorインスタンスが間接的に継承するプロパティがあります。
25.4.1.1 Generator.prototype.constructor
Generator.prototype.constructorの初期値は%Generator%です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.4.1.2 Generator.prototype.next ( value )
次の手順を実行します。
- this値 を g とする
- ? GeneratorResume(g, value) を返す
25.4.1.3 Generator.prototype.return ( value )
次の手順を実行します。
- this値 を g とする
- Completion { [[Type]]: return, [[Value]]: value, [[Target]]: empty } を C とする
- ? GeneratorResumeAbrupt(g, C) を返す
25.4.1.4 Generator.prototype.throw ( exception )
次の手順を実行します。
- this値 を g とする
- ThrowCompletion(exception) を C とする
- ? GeneratorResumeAbrupt(g, C) を返す
25.4.1.5 Generator.prototype [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"Generator"です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.4.2 Generatorインスタンスのプロパティ(Properties of Generator Instances)
Generatorインスタンスは、最初に表73で説明されている内部スロットが作成されます。
内部スロットt | 内容 |
---|---|
[[GeneratorState]] | ジェネレーターの現在の実行状態。 指定可能な値は、undefined、suspendedStart、suspedYield、execute、completedです。 |
[[GeneratorContext]] | ジェネレーターのコードを実行するときに使用される実行コンテキスト |
25.4.3 Generatorの抽象演算(Generator Abstract Operations)
25.4.3.1 GeneratorStart ( generator, generatorBody )
引数generator、generatorBodyを指定した抽象操作GeneratorStartは、次の手順を実行します。
- Assert: generator.[[GeneratorState]] の値は undefined
- 実行中の実行コンテキスト を genContext とする
- generator を genContext の Generatorコンポーネントにセットする
- 実行コンテキストの評価が再開されたときに次の手順が実行されるように、genContextのコード評価ステータス設定します。
- generatorBody の評価結果を result とする
- Assert: ここに戻ったなら、ジェネレーターが例外をスローしたか、暗黙的または明示的なリターンを実行した
- 実行コンテキストスタック からgenContextを削除し、実行コンテキストスタックの最上位にある 実行コンテキストを実行中の実行コンテキストとして復元する
- completed を generator.[[GeneratorState]] にセットする
- ジェネレータの状態がcompletedになると、それから離れることはなく、関連する実行コンテキストが再開されることもない。generatorに関連付けられている実行状態は、この時点で破棄できる
- result.[[Type]] が normal なら、 undefined を resultValue とする
- f. と異なり、 result.[[Type]] が return なら result.[[Value]] を resultValue とする
- g. と異なるなら、
- Assert: result.[[Type]] は throw
- Completion(result) を返す
- CreateIterResultObject(resultValue, true) を返す
- genContext を generator.[[GeneratorContext]] にセットする
- suspendedStart を generator.[[GeneratorState]] にセットする
- NormalCompletion(undefined) を返す
25.4.3.2 GeneratorValidate ( generator )
引数generatorを使用した抽象操作GeneratorValidate は、次の手順を実行します。
- ? RequireInternalSlot(generator, [[GeneratorState]]) を実行する
- Assert: generator は [[GeneratorContext]] 内部スロットがある
- generator.[[GeneratorState]] を state とする
- state が executing なら、TypeError例外をスローする
- state を返す
25.4.3.3 GeneratorResume ( generator, value )
引数generator、valueを指定した抽象操作GeneratorResumeは、次の手順を実行します。
- ? GeneratorValidate(generator) を state とする
- state が completed なら、 CreateIterResultObject(undefined, true) を返す
- Assert: state は suspendedStart か suspendedYield
- generator.[[GeneratorContext]] を genContext とする
- 実行中の実行コンテキスト を methodContext とする
- Suspend methodContext
- executing を generator.[[GeneratorState]] にセットする
- genContext を実行コンテキストスタックにプッシュする。genContextが実行中の実行コンテキストになる
- 一時停止した操作の結果として、NormalCompletion(value)を使用してgenContextの一時停止した評価を再開する。 再開された処理によって返される値を result とする
- Assert: ここに戻るとき、genContextは実行コンテキストスタックからすでに削除済み。また、methodContextは実行中の実行コンテキストになっている
- Completion(result) を返す
25.4.3.4 GeneratorResumeAbrupt ( generator, abruptCompletion )
引数generator、abruptCompletionを指定した抽象操作GeneratorResumeAbruptは、次の手順を実行します。
- ? GeneratorValidate(generator) を state とする
- state が suspendedStart なら、
- completed を generator.[[GeneratorState]] にセットする
- ジェネレータの状態がcompletedになると、それから離れることはなく、関連する実行コンテキストが再開されることもない。generator に関連付けられている実行状態は、この時点で破棄できる
- completed を state にセットする
- state が completed なら、
- abruptCompletion.[[Type]] が return なら、
- CreateIterResultObject(abruptCompletion.[[Value]], true) を返す
- Completion(abruptCompletion) を返す
- abruptCompletion.[[Type]] が return なら、
- Assert: state は suspendedYield
- generator.[[GeneratorContext]] を genContext とする
- 実行中の実行コンテキスト を methodContext とする
- Suspend methodContext
- executing を generator.[[GeneratorState]] にセットする
- genContext を実行コンテキストスタックにプッシュする。genContextが実行中の実行コンテキストになる
- 一時停止した操作の結果として、abruptCompletionを使用してgenContextの一時停止した評価を再開する。 再開された処理によって返される完了レコードを result とする
- Assert: ここに戻るとき、genContextは実行コンテキストスタックからすでに削除されている。また、methodContextは、実行中の実行コンテキストになっている
- Completion(result) を返す
25.4.3.5 GetGeneratorKind ( )
- 実行中の実行コンテキスト を genContext とする
- genContext に Generatorコンポーネントがないなら、 non-generator を返す
- genContext の Generatorコンポーネント を generator とする
- generator に [[AsyncGeneratorState]] 内部スロットがあるなら、 async を返す
- 4. と異なるなら、 sync を返す
25.4.3.6 GeneratorYield ( iterNextObj )
引数iterNextObjを使用した抽象操作GeneratorYield は、次の手順を実行します。
- Assert: iterNextObj は IteratorResultインターフェイスを実装するオブジェクト
- 実行中の実行コンテキスト を genContext とする
- Assert: genContext は generator の 実行コンテキスト
- genContext の Generatorコンポーネントの値を generator とする
- Assert: GetGeneratorKind() は sync
- suspendedYield を generator.[[GeneratorState]] にセットする
- 実行コンテキストスタック から genContext を削除し、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する
- Completion resumptionValueで評価が再開されたとき、次の手順が実行されるようにgenContextのコード評価ステータスを設定する。
- resumptionValue を返す
- NOTE: この抽象操作を呼び出したYieldExpressionの評価に戻る
- NormalCompletion(iterNextObj) を返す
- NOTE: genContextの評価を再開した操作の評価に戻る
25.5 AsyncGeneratorオブジェクト(AsyncGenerator Objects)
AsyncGeneratorオブジェクトは非同期ジェネレーター関数のインスタンスであり、AsyncIteratorインターフェイスとAsyncIterableインターフェイスの両方に準拠しています。
AsyncGeneratorインスタンスは、インスタンスを作成したAsyncGenerator関数の"prototype"プロパティを直接継承します。 AsyncGeneratorインスタンスは、AsyncGeneratorプロトタイプ組み込みの%AsyncGenerator.prototype%からプロパティを間接的に継承します。
25.5.1 AsyncGeneratorプロトタイプオブジェクトのプロパティ(Properties of the AsyncGenerator Prototype Object)
AsyncGeneratorプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%AsyncGeneratorPrototype%です。
- %AsyncGenerator%(AsyncGeneratorFunction.prototype)の"prototype"プロパティの初期値です。
- 通常のオブジェクトです。
- AsyncGeneratorインスタンスではありません。[[AsyncGeneratorState]]内部スロットがありません。
- [[Prototype]]内部スロットがあり、値は%AsyncIteratorPrototype%です。
- すべてのAsyncGeneratorインスタンスによって間接的に継承されるプロパティがあります。
25.5.1.1 AsyncGenerator.prototype.constructor
AsyncGenerator.prototype.constructorの初期値は%AsyncGenerator%です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.5.1.2 AsyncGenerator.prototype.next ( value )
- this値 を generator とする
- NormalCompletion(value) を completion とする
- ! AsyncGeneratorEnqueue(generator, completion) を返す
25.5.1.3 AsyncGenerator.prototype.return ( value )
- this値 を generator とする
- Completion { [[Type]]: return, [[Value]]: value, [[Target]]: empty } を completion とする
- ! AsyncGeneratorEnqueue(generator, completion) を返す
25.5.1.4 AsyncGenerator.prototype.throw ( exception )
- this値 を generator とする
- ThrowCompletion(exception) を completion とする
- ! AsyncGeneratorEnqueue(generator, completion) を返す
25.5.1.5 AsyncGenerator.prototype [ @@toStringTag ]
@@ toStringTagプロパティの初期値は、文字列値"AsyncGenerator"です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.5.2 AsyncGeneratorインスタンスのプロパティ(Properties of AsyncGenerator Instances)
AsyncGeneratorインスタンスは、最初に以下に説明する内部スロットが作成されます。
内部スロット | 内容 |
---|---|
[[AsyncGeneratorState]] | 非同期ジェネレーターの現在の実行状態。 使用可能な値は、undefined、suspendedStart、supposedYield、executeing、awaiting-return、completedです。 |
[[AsyncGeneratorContext]] | 非同期ジェネレーターのコードを実行するときに使用される実行コンテキスト。 |
[[AsyncGeneratorQueue]] | 非同期ジェネレーターの再開要求を表すAsyncGeneratorRequestレコードのリスト。 |
25.5.3 AsyncGenerator Abstract Operations
25.5.3.1 AsyncGeneratorRequestレコード(AsyncGeneratorRequest Records)
AsyncGeneratorRequestは、非同期ジェネレーターを再開する方法に関する情報を格納するためのRecord値です。対応するpromiseを実行または拒否する機能が含まれています。
次のフィールドがあります。
フィールド名 | 値 | 意味 |
---|---|---|
[[Completion]] | Completion レコード | 非同期ジェネレーターを再開するために使用する値 |
[[Capability]] | PromiseCapabilityレコード | リクエストに関連するpromise機能。 |
25.5.3.2 AsyncGeneratorStart ( generator, generatorBody )
- Assert: generator は AsyncGeneratorインスタンス
- Assert: generator.[[AsyncGeneratorState]] は undefined
- 実行中の実行コンテキスト を genContext とする
- generator を genContext の Generatorコンポーネント にセットする
- 実行コンテキスト の評価再開時に、次の手順が実行されるように genContextのコード評価ステータスを設定する
- generatorBody の評価結果を result とする
- Assert: こに戻ったなら、非同期ジェネレーターは例外をスローしたか、暗黙的または明示的なリターンを実行した。
- 実行コンテキストスタックからgenContextを削除し、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する
- completed を generator.[[AsyncGeneratorState]] にセットする
- result が正常完了なら、 undefined を resultValue とする
- e. と異なるなら、
- result.[[Value]] を resultValue とする
- result.[[Type]] が return でないなら、
- ! AsyncGeneratorReject(generator, resultValue) を返す
- ! AsyncGeneratorResolve(generator, resultValue, true) を返す
- genContext を generator.[[AsyncGeneratorContext]] にセットする
- suspendedStart を generator.[[AsyncGeneratorState]] にセットする
- 空の新規List を generator.[[AsyncGeneratorQueue]] にセットする
- undefined を返す
25.5.3.3 AsyncGeneratorResolve ( generator, value, done )
- Assert: generator は AsyncGeneratorインスタンス
- generator.[[AsyncGeneratorQueue]] を queue とする
- Assert: queue は empty Listではない
- queue の最初の要素を削除し、その要素の値を next とする
- next.[[Capability]] を promiseCapability とする
- ! CreateIterResultObject(value, done) を iteratorResult とする
- ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult ») を実行する
- ! AsyncGeneratorResumeNext(generator) を実行する
- undefined を返す
25.5.3.4 AsyncGeneratorReject ( generator, exception )
- Assert: generator は AsyncGeneratorインスタンス
- generator.[[AsyncGeneratorQueue]] を queue とする
- Assert: queue は empty List ではない
- queue の最初の要素を削除し、その要素の値を next とする
- next.[[Capability]] を promiseCapability とする
- ! Call(promiseCapability.[[Reject]], undefined, « exception ») を実行する
- ! AsyncGeneratorResumeNext(generator) を実行する
- undefined を返す
25.5.3.5 AsyncGeneratorResumeNext ( generator )
- Assert: generator は AsyncGeneratorインスタンス
- generator.[[AsyncGeneratorState]] を state とする
- Assert: state は executing ではない
- state が awaiting-return なら、 undefined を返す
- generator.[[AsyncGeneratorQueue]] を queue とする
- queue が empty List なら、 undefined を返す
- queue の最初の要素の値を next とする
- Assert: next は AsyncGeneratorRequestレコード
- next.[[Completion]] を completion とする
- completion が 突然の完了 なら、
- state が suspendedStart なら、
- completed を generator.[[AsyncGeneratorState]] にセットする
- completed を state にセットする
- state が completed なら、
- completion.[[Type]] が return なら、
- awaiting-return を generator.[[AsyncGeneratorState]] にセットする
- ? PromiseResolve(%Promise%, completion.[[Value]]) を promise とする
- AsyncGeneratorResumeNext Return Processor Fulfilled 関数で定義されたアルゴリズムステップを stepsFulfilled とする
- ! CreateBuiltinFunction(stepsFulfilled, « [[Generator]] ») を onFulfilled とする
- generator を onFulfilled.[[Generator]] にセットする
- AsyncGeneratorResumeNext Return Processor Rejected関数で定義されたアルゴリズムステップを stepsRejected とする
- ! CreateBuiltinFunction(stepsRejected, « [[Generator]] ») を onRejected とする
- generator を onRejected.[[Generator]] にセットする
- ! PerformPromiseThen(promise, onFulfilled, onRejected) を実行する
- undefined を返す
- i. と異なるなら、
- Assert: completion.[[Type]] は throw
- ! AsyncGeneratorReject(generator, completion.[[Value]]) を実行する
- undefined を返す
- completion.[[Type]] が return なら、
- state が suspendedStart なら、
- 10. と異なり、 state が completed なら ! AsyncGeneratorResolve(generator, undefined, true) を返す
- Assert: state は suspendedStart か suspendedYield
- generator.[[AsyncGeneratorContext]] を genContext とする
- 実行中の実行コンテキスト を callerContext とする
- Suspend callerContext
- executing を generator.[[AsyncGeneratorState]] にセットする
- genContext を実行コンテキストスタックにプッシュする。genContextが実行中の実行コンテキストになる
- 一時停止した操作の結果として、completionを使用してgenContextの一時停止した評価を再開する。 再開された処理によって返される完了レコードを result とする
- Assert: result は 突然の完了 にならない
- Assert: ここに戻ったなら、genContextはすでに実行コンテキストスタックから削除されており、callerContextは実行中の実行コンテキストである
- undefined を返す
25.5.3.5.1 AsyncGeneratorResumeNext Return Processor Fulfilled関数(Functions)
AsyncGeneratorResumeNext Return Processor Fulfilled関数は、AsyncGenerator.prototype.return(value)メソッドに渡されたpromiseをアンラップするためにAsyncGeneratorResumeNext仕様デバイスの一部として使用される匿名の組み込み関数です。この関数には、[[Generator]]内部スロットがあります。
この関数が引数valueを使用して呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- completed を F.[[Generator]].[[AsyncGeneratorState]] にセットする
- ! AsyncGeneratorResolve(F.[[Generator]], value, true) を返す
この関数の "length" プロパティは 1 です。
25.5.3.5.2 AsyncGeneratorResumeNext Return Processor Rejected関数(Functions)
AsyncGeneratorResumeNext Return Processor Rejected関数は、AsyncGenerator.prototype.return(value)メソッドに渡されたpromiseをアンラップするためにAsyncGeneratorResumeNext仕様デバイスの一部として使用される匿名の組み込み関数です。 この関数には、[[Generator]]内部スロットがあります。
この関数が引数reasonを使用して呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- completed を F.[[Generator]].[[AsyncGeneratorState]] にセットする
- ! AsyncGeneratorReject(F.[[Generator]], reason) を返す
この関数の "length" プロパティは 1 です。
25.5.3.6 AsyncGeneratorEnqueue ( generator, completion )
- Assert: completion は 完了レコード
- ! NewPromiseCapability(%Promise%) を promiseCapability とする
- Type(generator) が Object型 でない、 または generator に [[AsyncGeneratorState]] 内部スロットがないなら、
- generator.[[AsyncGeneratorQueue]] を queue とする
- AsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability } を request とする
- request を queue の最後に追加する
- generator.[[AsyncGeneratorState]] を state とする
- state が executing でないなら、
- ! AsyncGeneratorResumeNext(generator) を実行する
- promiseCapability.[[Promise]] を返す
25.5.3.7 AsyncGeneratorYield ( value )
引数valueを使用した抽象操作AsyncGeneratorYield は、次の手順を実行します。
- 実行中の実行コンテキスト を genContext とする
- Assert: genContext は generatorの 実行コンテキスト
- genContext の Generatorコンポーネントの値を generator とする
- Assert: GetGeneratorKind() は async
- ? Await(value) を value にセットする
- suspendedYield を generator.[[AsyncGeneratorState]] にセットする
- 実行コンテキストスタックからgenContextを削除し、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する
- Completion resumptionValueで評価が再開されたとき、次の手順が実行されるように genContextのコード評価ステータスを設定する
- resumptionValue.[[Type]] が return でないなら、 Completion(resumptionValue) を返す
- Await(resumptionValue.[[Value]]) を awaited とする
- awaited.[[Type]] が throw なら、 Completion(awaited) を返す
- Assert: awaited.[[Type]] は normal
- Completion { [[Type]]: return, [[Value]]: awaited.[[Value]], [[Target]]: empty } を返す
- NOTE:上記のステップのいずれかのreturnは、最初にこの抽象操作を呼び出したYieldExpressionプロダクションの評価に戻る
- ! AsyncGeneratorResolve(generator, value, false) を返す
- NOTE: genContextの評価を再開した操作の評価に戻る
25.6 Promiseオブジェクト(Promise Objects)
Promiseは、遅延(および場合によっては非同期)処理の最終結果のプレースホルダーとして使用されるオブジェクトです。
Promiseオブジェクトは、相互に排他的な3つの状態(fulfilled、rejected、pending)のいずれかになります。
- p.then(f,r) がすぐにジョブをキューに入れて関数fを呼び出す場合、promise pはfulfilledです。
- p.then(f,r) がすぐにジョブをキューに入れて関数rを呼び出す場合、promise pはrejectedです。
- fulfilledでもrejectedでもない場合、promiseはpendingです
Promiseはpendingでない場合、つまり、fulfilledまたはrejectedされた場合に解決されたことになります。
Promiseが解決された場合、または別のPromiseの状態と一致するように"locked in"された場合、約束はresolveされます。 resolveされたプロミスをresolveまたはrejectしようとしても効果はありません。 Promiseがresolveされない場合、Promiseは未解決です。 未解決のプロミスの状態は常にpendingです。 resolveされたPromiseは、pending、fulfilled、またはrejectedになる場合があります。
25.6.1 Promise抽象演算(Promise Abstract Operations)
25.6.1.1 PromiseCapabilityレコード(PromiseCapability Records)
PromiseCapabilityは、Promiseオブジェクトをresolveまたはrejectできる関数とともにカプセル化するために使用されるRecord値です。 PromiseCapabilityレコードは、NewPromiseCapability抽象操作によって生成されます。
PromiseCapabilityレコードには、次のフィールドがあります。
フィールド名 | 値 | 意味 |
---|---|---|
[[Promise]] | オブジェクト型 | promiseとして使用できるオブジェクト。 |
[[Resolve]] | 関数オブジェクト | promiseオブジェクトをresolveするために使用される関数。 |
[[Reject]] | 関数オブジェクト | promiseオブジェクトをrejectするために使用される関数。 |
25.6.1.1.1 IfAbruptRejectPromise ( value, capability )
IfAbruptRejectPromiseは、PromiseCapabilityレコードレコードを使用する一連のアルゴリズムステップの省略形です。
次の形式のアルゴリズムステップは、
- IfAbruptRejectPromise(value, capability)
次と同じ意味を持ちます。
25.6.1.2 PromiseReactionレコード(PromiseReaction Records)
PromiseReactionは、Promiseが特定の値で resolveまたはrejectされたときに、Promiseがどのように反応するかに関する情報を格納するために使用されるレコード値です。 PromiseReactionレコードは、PerformPromiseThen抽象操作によって作成され、NewPromiseReactionJobによって返される抽象クロージャによって使用されます。
PromiseReactionレコードには、次のフィールドがあります。
フィールド名 | 値 | 意味 |
---|---|---|
[[Capability]] | PromiseCapabilityレコード またはundefined |
このレコードがリアクションハンドラーを提供するPromiseCapability |
[[Type]] | Fulfill | Reject | [[Type]]は、[[Handler]]がundefinedの場合に使用され、解決時に固有の動作をおこないます。 |
[[Handler]] | 関数オブジェクト またはundefined |
受け取った値に適用する関数で、その戻り値によって派生したpromiseに対する動作が制御されます。 [[Handler]]がundefinedの場合、[[Type]]の値に依存する関数が使用されます。 |
25.6.1.3 CreateResolvingFunctions ( promise )
CreateResolvingFunctionsが引数promiseを使用して実行されると、次の手順が実行されます。
- Record { [[Value]]: false } を alreadyResolved とする
- Promise Resolve関数 のアルゴリズムステップを stepsResolve とする
- ! CreateBuiltinFunction(stepsResolve, « [[Promise]], [[AlreadyResolved]] ») を resolve とする
- promise を resolve.[[Promise]] にセットする
- alreadyResolved を resolve.[[AlreadyResolved]] にセットする
- Promise Reject関数 のアルゴリズムステップを stepsReject とする
- ! CreateBuiltinFunction(stepsReject, « [[Promise]], [[AlreadyResolved]] ») を reject とする
- promise を reject.[[Promise]] にセットする
- alreadyResolved を reject.[[AlreadyResolved]] にセットする
- Record { [[Resolve]]: resolve, [[Reject]]: reject } を返す
25.6.1.3.1 Promise Reject関数(Functions)
promise reject関数は、[[Promise]]と[[AlreadyResolved]]の内部スロットを持つ匿名の組み込み関数です。
引数reasonを指定して呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- Assert: F は値がオブジェクト型の [[Promise]] 内部スロットがある
- F.[[Promise]] を promise とする
- F.[[AlreadyResolved]] を alreadyResolved とする
- alreadyResolved.[[Value]] が true なら、 undefined を返す
- true を alreadyResolved.[[Value]] にセットする
- RejectPromise(promise, reason) を返す
この関数の "length" プロパティは 1 です。
25.6.1.3.2 Promise Resolve関数(Functions)
Promise Resolve関数は、[[Promise]]と[[AlreadyResolved]]の内部スロットを持つ匿名の組み込み関数です。
引数 resolution で呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- Assert: F は値がオブジェクト型の [[Promise]] 内部スロットがある
- F.[[Promise]] を promise とする
- F.[[AlreadyResolved]] を alreadyResolved とする
- alreadyResolved.[[Value]] が true なら、 undefined を返す
- true を alreadyResolved.[[Value]] にセットする
- SameValue(resolution, promise) が true なら、
- 新規作成した TypeError オブジェクト を selfResolutionError とする
- RejectPromise(promise, selfResolutionError) を返す
- Type(resolution) が Object型 でないなら、
- FulfillPromise(promise, resolution) を返す
- Get(resolution, "then") を then とする
- then が 突然の完了 なら、
- RejectPromise(promise, then.[[Value]]) を返す
- then.[[Value]] を thenAction とする
- IsCallable(thenAction) が false なら、
- FulfillPromise(promise, resolution) を返す
- NewPromiseResolveThenableJob(promise, resolution, thenAction) を job とする
- HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する
- undefined を返す
この関数の "length" プロパティは 1 です。
25.6.1.4 FulfillPromise ( promise, value )
FulfillPromise抽象演算が引数promiseとvalueを指定して呼び出されると、次の手順が実行されます。
- Assert: promise.[[PromiseState]] の値は pending
- promise.[[PromiseFulfillReactions]] を reactions とする
- value を promise.[[PromiseResult]] にセットする
- undefined を promise.[[PromiseFulfillReactions]] にセットする
- undefined を promise.[[PromiseRejectReactions]] にセットする
- fulfilled を promise.[[PromiseState]] にセットする
- TriggerPromiseReactions(reactions, value) を返す
25.6.1.5 NewPromiseCapability ( C )
抽象操作NewPromiseCapabilityはコンストラクター関数を受け取り、そのコンストラクター関数を組み込みのPromiseコンストラクターで使用してPromiseオブジェクトを作成し、resolve関数とreject関数を抽出します。 promiseとresolveおよびreject関数は、この抽象操作の値として返される新しいPromiseCapabilityレコードを初期化するために使用されます。
- IsConstructor(C) が false なら、TypeError例外をスローする
- NOTE: Cは、Promiseコンストラクターのパラメーター規則をサポートするコンストラクター関数であると見なす(25.6.3.1)
- PromiseCapability { [[Promise]]: undefined, [[Resolve]]: undefined, [[Reject]]: undefined } を promiseCapability とする
- GetCapabilitiesExecutor関数 のアルゴリズムステップを steps とする
- ! CreateBuiltinFunction(steps, « [[Capability]] ») を executor とする
- promiseCapability を executor.[[Capability]] にセットする
- ? Construct(C, « executor ») を promise とする
- IsCallable(promiseCapability.[[Resolve]]) が false なら、TypeError例外をスローする
- IsCallable(promiseCapability.[[Reject]]) が false なら、TypeError例外をスローする
- promise を promiseCapability.[[Promise]] にセットする
- promiseCapability を返す
25.6.1.5.1 GetCapabilitiesExecutor関数(Functions)
GetCapabilitiesExecutor関数は、[[Capability]]内部スロットを持つ匿名の組み込み関数です。
GetCapabilitiesExecutor関数が引数resolveおよびrejectを指定して呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- Assert: F は値がPromiseCapabilityレコードの [[Capability]] 内部スロットがある
- F.[[Capability]] を promiseCapability とする
- promiseCapability.[[Resolve]] が undefined でないなら、TypeError例外をスローする
- promiseCapability.[[Reject]] が undefined でないなら、TypeError例外をスローする
- resolve を promiseCapability.[[Resolve]] にセットする
- reject を promiseCapability.[[Reject]] にセットする
- undefined を返す
この関数の "length" プロパティは 2 です。
25.6.1.6 IsPromise ( x )
抽象操作IsPromiseは、オブジェクトがpromisかどうかをチェックします。
- Type(x) が Object型 でないなら、 false を返す
- x に [[PromiseState]] 内部スロットがないなら false を返す
- true を返す
25.6.1.7 RejectPromise ( promise, reason )
引数promiseとreasonを指定してRejectPromise抽象操作が呼び出されると、次の手順が実行されます。
- Assert: promise.[[PromiseState]] の値は pending
- promise.[[PromiseRejectReactions]] を reactions とする
- reason を promise.[[PromiseResult]] にセットする
- undefined を promise.[[PromiseFulfillReactions]] にセットする
- undefined を promise.[[PromiseRejectReactions]] にセットする
- rejected を promise.[[PromiseState]] にセットする
- promise.[[PromiseIsHandled]] が false なら HostPromiseRejectionTracker(promise, "reject") を実行する
- TriggerPromiseReactions(reactions, reason) を返す
25.6.1.8 TriggerPromiseReactions ( reactions, argument )
抽象操作TriggerPromiseReactionsは、PromiseReactionレコードのコレクションを取得し、レコードごとに新しいジョブをキューに入れます。 各ジョブは、PromiseReactionレコードの[[Type]]と[[Handler]]を処理し、[[Handler]]が関数の場合は、指定された引数を渡して呼び出します。 [[Handler]]が未定義の場合、動作は[[Type]]によって決定されます。
- reactions の 各要素を reaction とし、元の挿入順で reaction ごとに次を実行する
- NewPromiseReactionJob(reaction, argument) を job とする
- HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) を実行する
- undefined を返す
25.6.1.9 HostPromiseRejectionTracker ( promise, operation )
HostPromiseRejectionTrackerは、ホスト環境がPromiseのrejectを追跡できるようにする、実装定義の抽象操作です。
この操作の実装は、すべての場合で正常に完了する必要があります。 この操作のデフォルトの実装は、空の通常の完了を無条件に返すことです。
HostPromiseRejectionTrackerは、次の2つのシナリオで呼び出されます。
- ハンドラーなしでpromiseがrejectされたとき、引数operationが"reject"に設定されて呼び出されます。
- rejectされたpromiseにハンドラーが初めて追加されたとき、引数operationが"handle"に設定されて呼び出されます。
HostPromiseRejectionTrackerの一般的な実装では、未処理のrejectを開発者に通知しようとしますが、そのような以前の通知が後で新しいハンドラーがアタッチされて無効になった場合にも注意して通知します。
25.6.2 Promiseジョブ(Promise Jobs)
25.6.2.1 NewPromiseReactionJob ( reaction, argument )
抽象操作NewPromiseReactionJobは、reactionとargumentの2つの引数を取ります。そして着信値に適切なハンドラーを適用する新しいジョブ抽象クロージャを返します。さらに、ハンドラーの戻り値を使用して、そのハンドラーに関連付けられた派生promiseをresolveまたはrejectします。 次の手順を実行します。
- reactionとargumentをキャプチャし、呼び出されたときに次の手順を実行するパラメータのない新しいジョブ抽象クロージャを、job とする
- Assert: reaction は PromiseReactionレコード
- reaction.[[Capability]] を promiseCapability とする
- reaction.[[Type]] を type とする
- reaction.[[Handler]] を handler とする
- handler が undefined なら、
- type が Fulfill なら、 NormalCompletion(argument) を handlerResult とする
- i. と異なるなら、
- Assert: type は Reject
- ThrowCompletion(argument) を handlerResult とする
- e. と異なるなら、 Call(handler, undefined, « argument ») を handlerResult とする
- promiseCapability が undefined なら、
- Assert: handlerResult は 突然の完了 ではない
- NormalCompletion(empty) を返す
- handlerResult が 突然の完了 なら、
- h. と異なるなら、
- Completion(status) を返す
- null を handlerRealm とする
- reaction.[[Handler]] が undefined でないなら、
- GetFunctionRealm(reaction.[[Handler]]) を getHandlerRealmResult とする
- getHandlerRealmResult が a normal completion なら、 getHandlerRealmResult.[[Value]] を handlerRealm にセットする
- Record { [[Job]]: job, [[Realm]]: handlerRealm } を返す
25.6.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )
抽象操作NewPromiseResolveThenableJobは、promiseToResolve、thenable、thenの3つの引数を取り、次の手順を実行します。
- promiseToResolve、thenable、thenをキャプチャし、呼び出されたときに次の手順を実行するパラメーターのない新しいジョブ抽象クロージャを、jobとする
- CreateResolvingFunctions(promiseToResolve) を resolvingFunctions とする
- Call(then, thenable, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] ») を thenCallResult とする
- thenCallResult が 突然の完了 なら、
- Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] ») を status とする
- Completion(status) を返す
- Completion(thenCallResult) を返す
- GetFunctionRealm(then) を getThenRealmResult とする
- getThenRealmResult が正常完了なら、 getThenRealmResult.[[Value]] を thenRealm とする
- 異なるなら null を thenRealm とする
- Record { [[Job]]: job, [[Realm]]: thenRealm } を返す
25.6.3 Promiseコンストラクター(The Promise Constructor)
Promiseコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%Promise%です。
- グローバルオブジェクトの"Promise"プロパティの初期値です。
- コンストラクターとして呼び出されると、新しいPromiseオブジェクトを作成して初期化します。
- 関数として呼び出されると例外がスローされます。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。サブクラスコンストラクターには、PromiseおよびPromise.prototype組み込みメソッドをサポートしサブクラスインスタンスを作成および初期化するためにsuper呼び出しを含める必要があります。
25.6.3.1 Promise ( executor )
Promise が引数 executor で呼び出されると、次の手順が実行されます。
- NewTarget が undefined なら、TypeError例外をスローする
- IsCallable(executor) が false なら、TypeError例外をスローする
- ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») を promise とする
- pending を promise.[[PromiseState]] にセットする
- 空の新規List を promise.[[PromiseFulfillReactions]] にセットする
- 空の新規List を promise.[[PromiseRejectReactions]] にセットする
- false を promise.[[PromiseIsHandled]] にセットする
- CreateResolvingFunctions(promise) を resolvingFunctions とする
- Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] ») を completion とする
- completion が 突然の完了 なら、
- promise を返す
executorは、resolveとrejectの2つの引数で呼び出されます。 2つの引数は、延期された処理の最終的な完了または失敗を報告するためにexecutor関数によって使用される可能性のある関数です。 executor関数から戻るということは、延期されたアクションが完了したことを意味するのではなく、最終的に延期されたアクションを実行する要求が受け入れられたことを意味します。executor関数に渡されるresolve関数は、単一の引数を受け入れます。executorのコードは、最終的にresolve関数を呼び出して、関連付けられたPromiseオブジェクトを解決したいことを示します。 resolve関数に渡される引数は、遅延アクションの最終的な値を表し、実際のフルフィルメント値、またはフルフィルメントされた場合に値を提供する別のPromiseオブジェクトのいずれかになります。
executor関数に渡されるreject関数は、単一の引数を受け入れます。 executorのコードは、最終的にreject関数を呼び出して、関連付けられたPromiseが拒否され、実行されないことを示します。 reject関数に渡された引数は、promiseの拒否値として使用されます。 通常、これはErrorオブジェクトになります。
Promiseコンストラクターによってexecutor関数に渡されるresolveおよびreject関数には、関連するpromiseを実際にresolveおよびrejectする機能があります。 サブクラスには、resolveとrejectのカスタマイズされた値を渡す異なるコンストラクター動作がある場合があります
25.6.4 Promiseコンストラクターのプロパティ(Properties of the Promise Constructor)
Promiseコンストラクターは、次の特徴があります。
- [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
- 次のプロパティがあります。
25.6.4.1 Promise.all ( iterable )
all関数は、渡されたpromiseのフルフィルメント値の配列でfulfilledされる新しいpromiseを返すか、最初に渡されたpromiseがrejectされた時点でrejectします。 このアルゴリズムを実行すると、渡されたiterableのすべての要素がpromiseで解決されます。
- this値 を C とする
- ? NewPromiseCapability(C) を promiseCapability とする
- GetIterator(iterable) を iteratorRecord とする
- IfAbruptRejectPromise(iteratorRecord, promiseCapability)
- PerformPromiseAll(iteratorRecord, C, promiseCapability) を result とする
- result が 突然の完了 なら、
- iteratorRecord.[[Done]] が false なら IteratorClose(iteratorRecord, result) を result にセットする
- IfAbruptRejectPromise(result, promiseCapability)
- Completion(result) を返す
この関数は、%Promise_all%組み込みオブジェクトです。
25.6.4.1.1 ランタイムセマンティクス(Runtime Semantics): PerformPromiseAll ( iteratorRecord, constructor, resultCapability )
PerformPromiseAll抽象操作が引数iteratorRecord、constructor、resultCapabilityを指定して呼び出されると、次の手順が実行されます。
- Assert: IsConstructor(constructor) は true
- Assert: resultCapability は PromiseCapabilityレコード
- 空の新規List を values とする
- Record { [[Value]]: 1 } を remainingElementsCount とする
- ? Get(constructor, "resolve") を promiseResolve とする
- ! IsCallable(promiseResolve) が false なら、TypeError例外をスローする
- 0 を index とする
- 繰り返す
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了 なら true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(next)
- next が false なら、
- true を iteratorRecord.[[Done]] にセットする
- remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
- remainingElementsCount.[[Value]] が 0 なら、
- resultCapability.[[Promise]] を返す
- IteratorValue(next) を nextValue とする
- nextValue が 突然の完了 なら true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(nextValue)
- values に undefined を追加する
- ? Call(promiseResolve, constructor, « nextValue ») を nextPromise とする
- Promise.all Resolve Element関数のアルゴリズムステップを steps とする
- ! CreateBuiltinFunction(steps, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») を resolveElement とする
- Record { [[Value]]: false } を resolveElement.[[AlreadyCalled]] にセットする
- index を resolveElement.[[Index]] にセットする
- values を resolveElement.[[Values]] にセットする
- resultCapability を resolveElement.[[Capability]] にセットする
- remainingElementsCount を resolveElement.[[RemainingElements]] にセットする
- remainingElementsCount.[[Value]] + 1 を remainingElementsCount.[[Value]] にセットする
- ? Invoke(nextPromise, "then", « resolveElement, resultCapability.[[Reject]] ») を実行する
- index + 1 を index にセットする
25.6.4.1.2 Promise.all Resolve Element関数(Functions)
Promise.all Resolve Element関数は、特定のPromise.all要素を解決するために使用される匿名の組み込み関数です。 この関数には、[[Index]]、[[Values]]、[[Capability]]、[[RemainingElements]]、[[AlreadyCalled]]の内部スロットがあります。
この関数が引数xで呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- F.[[AlreadyCalled]] を alreadyCalled とする
- alreadyCalled.[[Value]] が true なら、 undefined を返す
- true を alreadyCalled.[[Value]] にセットする
- F.[[Index]] を index とする
- F.[[Values]] を values とする
- F.[[Capability]] を promiseCapability とする
- F.[[RemainingElements]] を remainingElementsCount とする
- x を values[index] にセットする
- remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
- remainingElementsCount.[[Value]] が 0 なら、
- undefined を返す
この関数の "length" プロパティは 1 です。
25.6.4.2 Promise.allSettled ( iterable )
allSettled関数は、promiseステータスのスナップショットの配列に対して解決するpromiseを返します。ただし、元のpromiseがすべて解決された後、つまりfulfilledまたはrejectされた後でのみ返されます。 このアルゴリズムを実行すると、渡されたすべてのpromise要素が解決されます。
- this値 を C とする
- ? NewPromiseCapability(C) を promiseCapability とする
- GetIterator(iterable) を iteratorRecord とする
- IfAbruptRejectPromise(iteratorRecord, promiseCapability)
- PerformPromiseAllSettled(iteratorRecord, C, promiseCapability) を result とする
- result が 突然の完了 なら、
- iteratorRecord.[[Done]] が false なら IteratorClose(iteratorRecord, result) を result にセットする
- IfAbruptRejectPromise(result, promiseCapability)
- Completion(result) を返す
25.6.4.2.1 ランタイムセマンティクス(Runtime Semantics): PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability )
PerformPromiseAllSettled抽象操作が引数iteratorRecord、constructor、resultCapabilityを指定して呼び出されると、次の手順が実行されます。
- Assert: ! IsConstructor(constructor) は true
- Assert: resultCapability は PromiseCapabilityレコード
- 空の新規List を values とする
- Record { [[Value]]: 1 } を remainingElementsCount とする
- 0 を index とする
- ? Get(constructor, "resolve") を promiseResolve とする
- IsCallable(promiseResolve) が false なら、TypeError例外をスローする
- 繰り返す
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了 なら true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(next)
- next が false なら、
- true を iteratorRecord.[[Done]] にセットする
- remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
- remainingElementsCount.[[Value]] が 0 なら、
- resultCapability.[[Promise]] を返す
- IteratorValue(next) を nextValue とする
- nextValue が 突然の完了 なら true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(nextValue)
- values に undefined を追加する
- ? Call(promiseResolve, constructor, « nextValue ») を nextPromise とする
- Promise.allSettled Resolve Element関数 のアルゴリズムステップを steps とする
- ! CreateBuiltinFunction(steps, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») を resolveElement とする
- Record { [[Value]]: false } を alreadyCalled とする
- alreadyCalled を resolveElement.[[AlreadyCalled]] にセットする
- index を resolveElement.[[Index]] にセットする
- values を resolveElement.[[Values]] にセットする
- resultCapability を resolveElement.[[Capability]] にセットする
- remainingElementsCount を resolveElement.[[RemainingElements]] にセットする
- Promise.allSettled Reject Element関数 のアルゴリズムステップを rejectSteps とする
- ! CreateBuiltinFunction(rejectSteps, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») を rejectElement とする
- alreadyCalled を rejectElement.[[AlreadyCalled]] にセットする
- index を rejectElement.[[Index]] にセットする
- values を rejectElement.[[Values]] にセットする
- resultCapability を rejectElement.[[Capability]] にセットする
- remainingElementsCount を rejectElement.[[RemainingElements]] にセットする
- remainingElementsCount.[[Value]] + 1 を remainingElementsCount.[[Value]] にセットする
- ? Invoke(nextPromise, "then", « resolveElement, rejectElement ») を実行する
- index + 1 を index にセットする
25.6.4.2.2 Promise.allSettled Resolve Element関数(Functions)
Promise.allSettled Resolve Element関数は、特定のPromise.allSettled要素を解決するために使用される匿名の組み込み関数です。 この関数には、[[Index]]、[[Values]]、[[Capability]]、[[RemainingElements]]、[[AlreadyCalled]]の内部スロットがあります。
この関数が引数 x で呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- F.[[AlreadyCalled]] を alreadyCalled とする
- alreadyCalled.[[Value]] が true なら、 undefined を返す
- true を alreadyCalled.[[Value]] にセットする
- F.[[Index]] を index とする
- F.[[Values]] を values とする
- F.[[Capability]] を promiseCapability とする
- F.[[RemainingElements]] を remainingElementsCount とする
- ! OrdinaryObjectCreate(%Object.prototype%) を obj とする
- ! CreateDataPropertyOrThrow(obj, "status", "fulfilled") を実行する
- ! CreateDataPropertyOrThrow(obj, "value", x) を実行する
- obj を values[index] にセットする
- remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
- remainingElementsCount.[[Value]] が 0 なら、
- undefined を返す
この関数の "length" プロパティは 1 です。
25.6.4.2.3 Promise.allSettled Reject Element関数(Functions)
Promise.allSettled Reject Element関数は、特定のPromise.allSettled要素を拒否するために使用される匿名の組み込み関数です。 この関数には、[[Index]]、[[Values]]、[[Capability]]、[[RemainingElements]]、[[AlreadyCalled]]の内部スロットがあります。
この関数が引数 x で呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- F.[[AlreadyCalled]] を alreadyCalled とする
- alreadyCalled.[[Value]] が true なら、 undefined を返す
- true を alreadyCalled.[[Value]] にセットする
- F.[[Index]] を index とする
- F.[[Values]] を values とする
- F.[[Capability]] を promiseCapability とする
- F.[[RemainingElements]] を remainingElementsCount とする
- ! OrdinaryObjectCreate(%Object.prototype%) を obj とする
- ! CreateDataPropertyOrThrow(obj, "status", "rejected") を実行する
- ! CreateDataPropertyOrThrow(obj, "reason", x) を実行する
- obj を values[index] にセットする
- remainingElementsCount.[[Value]] - 1 を remainingElementsCount.[[Value]] にセットする
- remainingElementsCount.[[Value]] が 0 なら、
- undefined を返す
この関数の "length" プロパティは 1 です。
25.6.4.3 Promise.prototype
Promise.prototypeの初期値は%Promise.prototype%です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。
25.6.4.4 Promise.race ( iterable )
race関数は、最初に解決したpromiseと同じ結果で解決される新しいpromiseを返します。 このアルゴリズムを実行すると、渡されたiterableのすべての要素がpromiseで解決されます。
- this値 を C とする
- ? NewPromiseCapability(C) を promiseCapability とする
- GetIterator(iterable) を iteratorRecord とする
- IfAbruptRejectPromise(iteratorRecord, promiseCapability)
- PerformPromiseRace(iteratorRecord, C, promiseCapability) を result とする
- result が 突然の完了 なら、
- iteratorRecord.[[Done]] が false なら IteratorClose(iteratorRecord, result) を result にセットする
- IfAbruptRejectPromise(result, promiseCapability)
- Completion(result) を返す
25.6.4.4.1 ランタイムセマンティクス(Runtime Semantics): PerformPromiseRace ( iteratorRecord, constructor, resultCapability )
PerformPromiseRace抽象操作が引数iteratorRecord、constructor、およびresultCapabilityを指定して呼び出されると、次の手順が実行されます。
- Assert: IsConstructor(constructor) は true
- Assert: resultCapability は PromiseCapabilityレコード
- ? Get(constructor, "resolve") を promiseResolve とする
- ! IsCallable(promiseResolve) が false なら、TypeError例外をスローする
- 繰り返す
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了, true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(next)
- next が false なら、
- true を iteratorRecord.[[Done]] にセットする
- resultCapability.[[Promise]] を返す
- IteratorValue(next) を nextValue とする
- nextValue が 突然の完了 なら true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(nextValue)
- ? Call(promiseResolve, constructor, « nextValue ») を nextPromise とする
- ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») を実行する
25.6.4.5 Promise.reject ( r )
reject関数は、渡された引数でrejectされた新しいpromiseを返します。
この関数は、%Promise_reject%組み込みオブジェクトです。
25.6.4.6 Promise.resolve ( x )
resolve関数は、渡された引数でresolveされた新しいpromiseを返すします。ただし、引数がコンストラクターによって生成されたpromiseである場合は引数自体を返します。
- this値 を C とする
- Type(C) が Object型でないなら、TypeError例外をスローする
- ? PromiseResolve(C, x) を返す
この関数は、%Promise_resolve%組み込みオブジェクトです。
25.6.4.6.1 PromiseResolve ( C, x )
コンストラクターCと値xが与えられた抽象操作PromiseResolveは、xで解決された新しいpromiseを返します。
25.6.4.7 get Promise [ @@species ]
Promise[@@species]はsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を返す
この関数の"name"プロパティの値は"get [Symbol.species]"です。
25.6.5 Promiseプロトタイプオブジェクトのプロパティ(Properties of the Promise Prototype Object)
Promiseプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%PromisePrototype%です。
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
- 通常のオブジェクトです。
- [[PromiseState]]内部スロットまたはPromiseインスタンスの他の内部スロットがありません。
25.6.5.1 Promise.prototype.catch ( onRejected )
catch が引数 onRejected で呼び出されると、次の手順が実行されます。
25.6.5.2 Promise.prototype.constructor
Promise.prototype.constructorの初期値は%Promise%です。
25.6.5.3 Promise.prototype.finally ( onFinally )
finally が引数 onFinally で呼び出されると、次の手順が実行されます。
- this値 を promise とする
- Type(promise) が Object型でないなら、TypeError例外をスローする
- ? SpeciesConstructor(promise, %Promise%) を C とする
- Assert: IsConstructor(C) は true
- IsCallable(onFinally) が false なら、
- onFinally を thenFinally とする
- onFinally を catchFinally とする
- 5. と異なるなら、
- Then Finally関数 のアルゴリズムステップを stepsThenFinally とする
- ! CreateBuiltinFunction(stepsThenFinally, « [[Constructor]], [[OnFinally]] ») を thenFinally とする
- C を thenFinally.[[Constructor]] にセットする
- onFinally を thenFinally.[[OnFinally]] にセットする
- Catch Finally関数 のアルゴリズムステップを stepsCatchFinally とする
- ! CreateBuiltinFunction(stepsCatchFinally, « [[Constructor]], [[OnFinally]] ») を catchFinally とする
- C を catchFinally.[[Constructor]] にセットする
- onFinally を catchFinally.[[OnFinally]] にセットする
- ? Invoke(promise, "then", « thenFinally, catchFinally ») を返す
25.6.5.3.1 Then Finally関数(Functions)
Then Finally関数は、[[Constructor]]と[[OnFinally]]の内部スロットを持つ匿名の組み込み関数です。 [[Constructor]]内部スロットの値はPromiseのようなコンストラクター関数オブジェクトであり、[[OnFinally]]内部スロットの値は関数オブジェクトです。
この関数が引数 value で呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- F.[[OnFinally]] を onFinally とする
- Assert: IsCallable(onFinally) は true
- ? Call(onFinally, undefined) を result とする
- F.[[Constructor]] を C とする
- Assert: IsConstructor(C) は true
- ? PromiseResolve(C, result) を promise とする
- value を返す関数と同等なものを valueThunk とする
- ? Invoke(promise, "then", « valueThunk ») を返す
この関数の "length" プロパティは 1 です。
25.6.5.3.2 Catch Finally関数(Functions)
Catch Finally関数は、[[Constructor]]と[[OnFinally]]の内部スロットを持つ匿名の組み込み関数です。 [[Constructor]]内部スロットの値はPromiseのようなコンストラクター関数オブジェクトであり、[[OnFinally]]内部スロットの値は関数オブジェクトです。
この関数が引数 reason で呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を F とする
- F.[[OnFinally]] を onFinally とする
- Assert: IsCallable(onFinally) は true
- ? Call(onFinally, undefined) を result とする
- F.[[Constructor]] を C とする
- Assert: IsConstructor(C) は true
- ? PromiseResolve(C, result) を promise とする
- reason をスローする関数と同等なものを thrower とする
- ? Invoke(promise, "then", « thrower ») を返す
この関数の "length" プロパティは 1 です。
25.6.5.4 Promise.prototype.then ( onFulfilled, onRejected )
thenメソッドが引数onFulfilledおよびonRejectedを指定して呼び出されると、次の手順が実行されます。
- this値 を promise とする
- IsPromise(promise) が false なら、TypeError例外をスローする
- ? SpeciesConstructor(promise, %Promise%) を C とする
- ? NewPromiseCapability(C) を resultCapability とする
- PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability) を返す
この関数は、%PromiseProto_then%組み込みオブジェクトです。
25.6.5.4.1 PerformPromiseThen ( promise, onFulfilled, onRejected [ , resultCapability ] )
抽象操作PerformPromiseThenは、解決アクションとしてonFulfilledおよびonRejectedを使用して、promiseで"then"操作を実行します。 resultCapabilityが渡されると、resultCapabilityのpromiseを更新して結果が保存されます。 渡されない場合、PerformPromiseThenは、結果が重要ではない仕様内部操作によって呼び出されます。
- Assert: IsPromise(promise) は true
- resultCapability が 存在するなら、
- Assert: resultCapability は PromiseCapabilityレコード
- 2. と異なるなら、
- undefined を resultCapability にセットする
- IsCallable(onFulfilled) が false なら、
- undefined を onFulfilled にセットする
- IsCallable(onRejected) が false なら、
- undefined を onRejected にセットする
- PromiseReaction { [[Capability]]: resultCapability, [[Type]]: Fulfill, [[Handler]]: onFulfilled } を fulfillReaction とする
- PromiseReaction { [[Capability]]: resultCapability, [[Type]]: Reject, [[Handler]]: onRejected } を rejectReaction とする
- promise.[[PromiseState]] が pending なら、
- promise.[[PromiseFulfillReactions]] の最後に fulfillReaction を追加する
- Listthat is promise.[[PromiseRejectReactions]] の最後に rejectReaction を追加する
- 8. と異なり、 promise.[[PromiseState]] is fulfilled なら、
- promise.[[PromiseResult]] を value とする
- NewPromiseReactionJob(fulfillReaction, value) を fulfillJob とする
- HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]]) を実行する
- 9. と異なるなら、
- Assert: promise.[[PromiseState]] の値は rejected
- promise.[[PromiseResult]] を reason とする
- promise.[[PromiseIsHandled]] が false なら HostPromiseRejectionTracker(promise, "handle") を実行する
- NewPromiseReactionJob(rejectReaction, reason) を rejectJob とする
- HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]]) を実行する
- true を promise.[[PromiseIsHandled]] にセットする
- resultCapability が undefined なら、
- undefined を返す
- 12. と異なるなら、
- resultCapability.[[Promise]] を返す
25.6.5.5 Promise.prototype [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"Promise"です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.6.6 Promiseインスタンスのプロパティ(Properties of Promise Instances)
Promiseインスタンスは、Promiseプロトタイプオブジェクト(組み込みの%Promise.prototype%)からプロパティを継承する通常のオブジェクトです。 Promiseインスタンスは、最初に表78の内部スロットが作成されます。
内部スロット | 内容 |
---|---|
[[PromiseState]] | pending、fulfilled、rejectedのいずれか。 promiseがthenメソッドへの着信呼び出しにどのように反応するかを管理します。 |
[[PromiseResult]] | promiseがfulfilledまたはrejectedされた場合の値。 [[PromiseState]]がpendingでない場合にのみ意味があります。 |
[[PromiseFulfillReactions]] | Promiseがpendingからfulfilled移行時に処理されるPromiseReactionレコードのリスト。 |
[[PromiseRejectReactions]] | promiseがpendingからrejected移行時に処理されるPromiseReactionレコードのリスト。 |
[[PromiseIsHandled]] | プロミスにフルフィルメントハンドラーまたはrejectionハンドラーがあるかどうかを示すブール値。 未処理のrejection追跡で使用されます。 |
25.7 AsyncFunctionオブジェクト(AsyncFunction Objects)
AsyncFunctionオブジェクトは、通常、AsyncFunctionDeclaration、AsyncFunctionExpression、AsyncMethod、およびAsyncArrowFunctionを評価することによって作成される関数です。 また、%AsyncFunction%組み込み関数を呼び出すことで作成することもできます。
25.7.1 AsyncFunctionコンストラクター(The AsyncFunction Constructor)
AsyncFunctionコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%AsyncFunction%です。
- Functionのサブクラスです。
- 関数として呼び出されると、新しいAsyncFunctionオブジェクトを作成して初期化します。 したがって、関数呼び出しAsyncFunction(…)は、同じ引数を持つオブジェクト作成式new AsyncFunction(…)と同等です。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、組み込みの非同期関数動作に必要な内部スロットとともにサブクラスインスタンスを作成および初期化するために、super呼び出しを含める必要があります。
25.7.1.1 AsyncFunction ( p1, p2, … , pn, body )
最後の引数は、非同期関数の本体(実行可能コード)を指定します。 上記の引数はすべて仮パラメーターを指定します。
AsyncFunction関数がいくつかの引数p1、p2、…、pn、body(nが0の場合、つまりp引数がなく、bodyも提供されない場合)で呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を C とする
- [[Call]]または[[Construct]]によってこの関数に渡されたargumentsList を args とする
- CreateDynamicFunction(C, NewTarget, async, args) を返す
25.7.2 AsyncFunctionコンストラクターのプロパティ(Properties of the AsyncFunction Constructor)
AsyncFunctionコンストラクターは、次の特徴があります。
- Functionコンストラクターから継承する標準の組み込み関数オブジェクトです。
- [[Prototype]]内部スロットがあり、値は%Function%です。
- "name" プロパティがあり、値は"AsyncFunction"です。
- 以下のプロパティがあります。
25.7.2.1 AsyncFunction.length
これは、値が1のデータプロパティです。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.7.2.2 AsyncFunction.prototype
AsyncFunction.prototypeの初期値は%AsyncFunction.prototype%です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。
25.7.3 AsyncFunctionプロトタイプオブジェクトのプロパティ(Properties of the AsyncFunction Prototype Object)
AsyncFunctionプロトタイプオブジェクトは、次の特徴があります。
- 通常のオブジェクトです。
- 関数オブジェクトではありません。[[ECMAScriptCode]]内部スロットまたは表27にリストされているその他の内部スロットを持っていません。
- %AsyncFunction%の"prototype"プロパティの値です。
- 組み込みオブジェクト%AsyncFunctionPrototype%です。
- [[Prototype]]内部スロットがあり、値は%Function.prototype%です。
25.7.3.1 AsyncFunction.prototype.constructor
AsyncFunction.prototype.constructorの初期値は%AsyncFunction%です。
このプロパティの属性は { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.7.3.2 AsyncFunction.prototype [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"AsyncFunction"です。
このプロパティの属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }です。
25.7.4 AsyncFunctionインスタンス(AsyncFunction Instances)
AsyncFunctionインスタンスはECMAScript関数オブジェクトであり、表27にリストされている内部スロットがあります。[[IsClassConstructor]]内部スロットの値はfalseです。 AsyncFunctionインスタンスはコンストラクターではなく、[[Construct]]内部メソッドを持っていません。 AsyncFunctionインスタンスは構築できないため、プロトタイププロパティはありません。
各AsyncFunctionインスタンスには、次の独自のプロパティがあります。
25.7.4.1 length
Functionインスタンスの "length"プロパティの仕様(19.2.4.1)が、AsyncFunctionインスタンスにも適用されます。
25.7.4.2 name
Functionインスタンスの "name"プロパティの仕様(19.2.4.2)が、AsyncFunctionインスタンスにも適用されます。
25.7.5 Async関数抽象演算(Async Functions Abstract Operations)
25.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody )
- 実行中の実行コンテキスト を runningContext とする
- runningContext の a copy を asyncContext とする
- NOTE: 以下の手順で実行を再開するには、実行状態をコピーする必要がある。 現在実行中のコンテキストを再開することについては明確に定義していない
- 実行コンテキストの評価が再開されたときに次の手順が実行されるように、asyncContextのコード評価状態を設定する
- asyncFunctionBody の評価結果を result とする
- Assert: ここに戻ったなら、非同期関数が例外をスローしたか、暗黙的または明示的な戻りを実行した。 待機はすべて完了した。
- 実行コンテキストスタックからasyncContextを削除し、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する
- result.[[Type]] が normal なら、
- d. と異なり、 result.[[Type]] が return なら、
- e. と異なるなら、
- Returnする
- asyncContext を実行コンテキストスタックにプッシュする。asyncContextが実行中の実行コンテキストになる
- asyncContextの一時停止された評価を再開する。 再開された処理によって返される値を result とする
- Assert: ここに戻ったなら、asyncContextは実行コンテキストスタックからすでに削除されており、runningContextは現在実行中の実行コンテキストである
- Assert: result は値がundefinedの通常の完了。完了値の可能なソースはAwait、または、async関数が何も待機しない場合は、上記のステップ4.g
- Returnする