27 制御抽象オブジェクト

27.1 反復

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

interfaceは、関連付けられた値が特定の仕様に一致するproperty keysの集合である。interfaceの仕様によって記述されたすべてのpropertiesを提供する任意のobjectは、そのinterfaceにconformsする。interfaceはdistinct objectによって表現されない。任意のinterfaceにconformする、別々に実装されたobjectsが多数存在しうる。個々のobjectは複数のinterfacesにconformしうる。

27.1.1.1 Iterableインターフェイス

iterable interfaceは、Table 79で記述されるpropertiesを含む:

Table 79: Iterable Interface Required Properties
Property Value Requirements
%Symbol.iterator% iterator objectを返すfunction 返されるobjectはiterator interfaceにconformしなければならない。

27.1.1.2 Iteratorインターフェイス

iterator interfaceを実装するobjectは、Table 80内のpropertyを含まなければならない。そのようなobjectsは、Table 81内のpropertiesを実装してもよい。

Table 80: Iterator Interface Required Properties
Property Value Requirements
"next" IteratorResult objectを返すfunction 返されるobjectはIteratorResult interfaceにconformしなければならない。iteratornext methodへの以前のcallが"done" propertyがtrueであるIteratorResult objectを返した場合、そのobjectのnext methodへの後続のすべてのcallsも、"done" propertyがtrueであるIteratorResult objectを返すべきである。ただし、このrequirementは強制されない。
Note 1

next functionにargumentsを渡してもよいが、それらの解釈およびvalidityはtarget iteratorに依存する。for-of statementおよびiteratorsの他の一般的な利用者はargumentsを渡さないため、そのような方法で使用されることを期待するiterator objectsは、argumentsなしで呼び出されることに対処できるよう準備されていなければならない。

Table 81: Iterator Interface Optional Properties
Property Value Requirements
"return" IteratorResult objectを返すfunction 返されるobjectはIteratorResult interfaceにconformしなければならない。このmethodをinvokeすると、呼び出し側がiteratorに対してこれ以上next method callsを行う意図がないことをiterator objectに通知する。返されるIteratorResult objectは、典型的にはvalueがtrueである"done" property、およびreturn methodのargumentとして渡された値を持つ"value" propertyを持つ。ただし、このrequirementは強制されない。
"throw" IteratorResult objectを返すfunction 返されるobjectはIteratorResult interfaceにconformしなければならない。このmethodをinvokeすると、呼び出し側がerror conditionを検出したことをiterator objectに通知する。argumentはerror conditionを識別するために使用されてもよく、典型的にはexception objectである。典型的な応答は、argumentとして渡されたvalueをthrowすることである。methodがthrowしない場合、返されるIteratorResult objectは、典型的にはvalueがtrueである"done" propertyを持つ。
Note 2

典型的には、これらのmethodsの呼び出し側は、それらをinvokeする前にそれらの存在をcheckすべきである。for-ofyield*、およびarray destructuringを含む特定のECMAScript language featuresは、existence checkを実行した後にこれらのmethodsをcallする。iterable objectsをargumentsとして受け入れるほとんどのECMAScript library functionsも、それらを条件付きでcallする。

27.1.1.3 Async Iterableインターフェイス

async iterable interfaceは、Table 82で記述されるpropertiesを含む:

Table 82: Async Iterable Interface Required Properties
Property Value Requirements
%Symbol.asyncIterator% async iterator objectを返すfunction 返されるobjectはasync iterator interfaceにconformしなければならない。

27.1.1.4 Async Iteratorインターフェイス

async iterator interfaceを実装するobjectは、Table 83内のpropertiesを含まなければならない。そのようなobjectsは、Table 84内のpropertiesを実装してもよい。

Table 83: Async Iterator Interface Required Properties
Property Value Requirements
"next" IteratorResult objectに対するpromiseを返すfunction

返されるpromiseは、fulfilledされたときに、IteratorResult interfaceにconformするobjectでfulfillしなければならない。async iteratornext methodへの以前のcallが"done" propertyがtrueであるIteratorResult objectに対するpromiseを返した場合、そのobjectのnext methodへの後続のすべてのcallsも、"done" propertyがtrueであるIteratorResult objectに対するpromiseを返すべきである。ただし、このrequirementは強制されない。

さらに、fulfillment valueとして機能するIteratorResult objectは、valueがpromise(または“thenable”)でない"value" propertyを持つべきである。ただし、このrequirementも強制されない。

Note 1

next functionにargumentsを渡してもよいが、それらの解釈およびvalidityはtarget async iteratorに依存する。for-await-of statementおよびasync iteratorsの他の一般的な利用者はargumentsを渡さないため、そのような方法で使用されることを期待するasync iterator objectsは、argumentsなしで呼び出されることに対処できるよう準備されていなければならない。

Table 84: Async Iterator Interface Optional Properties
Property Value Requirements
"return" IteratorResult objectに対するpromiseを返すfunction

返されるpromiseは、fulfilledされたときに、IteratorResult interfaceにconformするobjectでfulfillしなければならない。このmethodをinvokeすると、呼び出し側がasync iteratorに対してこれ以上next method callsを行う意図がないことをasync iterator objectに通知する。返されるpromiseはIteratorResult objectでfulfillし、そのobjectは典型的にはvalueがtrueである"done" property、およびreturn methodのargumentとして渡された値を持つ"value" propertyを持つ。ただし、このrequirementは強制されない。

さらに、fulfillment valueとして機能するIteratorResult objectは、valueがpromise(または“thenable”)でない"value" propertyを持つべきである。argument valueが典型的な方法で使用される場合、それがrejected promiseなら同じreasonでrejectedされたpromiseが返されるべきであり、それがfulfilled promiseなら、そのfulfillment valueが返されるpromiseのIteratorResult object fulfillment valueの"value" propertyとして使用されるべきである。ただし、これらのrequirementsも強制されない。

"throw" IteratorResult objectに対するpromiseを返すfunction

返されるpromiseは、fulfilledされたときに、IteratorResult interfaceにconformするobjectでfulfillしなければならない。このmethodをinvokeすると、呼び出し側がerror conditionを検出したことをasync iterator objectに通知する。argumentはerror conditionを識別するために使用されてもよく、典型的にはexception objectである。典型的な応答は、argumentとして渡されたvalueでrejectするrejected promiseを返すことである。

返されるpromiseがfulfilledされる場合、IteratorResult object fulfillment valueは、典型的にはvalueがtrueである"done" propertyを持つ。さらに、それはvalueがpromise(または“thenable”)でない"value" propertyを持つべきであるが、このrequirementは強制されない。

Note 2

典型的には、これらのmethodsの呼び出し側は、それらをinvokeする前にそれらの存在をcheckすべきである。for-await-ofおよびyield*を含む特定のECMAScript language featuresは、existence checkを実行した後にこれらのmethodsをcallする。

27.1.1.5 IteratorResultインターフェイス

IteratorResult interfaceは、Table 85に列挙されるpropertiesを含む:

Table 85: IteratorResult Interface Properties
Property Value Requirements
"done" Boolean これはiterator next method callのresult statusである。iteratorのendに到達した場合、"done"trueである。endに到達していない場合、"done"falseであり、valueが利用可能である。"done" property(ownまたはinherited)が存在しない場合、そのvalueはfalseであると見なされる。
"value" ECMAScript language value doneがfalseなら、これはcurrent iteration element valueである。doneがtrueなら、これはiteratorのreturn value(供給されている場合)である。iteratorにreturn valueがない場合、"value"undefinedである。その場合、conforming objectが明示的な"value" propertyをinheritしていないなら、"value" propertyは存在しなくてもよい。

27.1.2 Iterator Helperオブジェクト

Iterator Helper objectは、特定のsource iterator objectのlazy transformationを表すordinary objectである。Iterator Helper objectsにはnamed constructorは存在しない。代わりに、Iterator Helper objectsはIterator instance objectsの特定のmethodsをcallすることによって作成される。

27.1.2.1 %IteratorHelperPrototype%オブジェクト

%IteratorHelperPrototype% objectは:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

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

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. objthis valueとする。
  2. RequireInternalSlot(obj, [[UnderlyingIterators]])を実行する。
  3. Assert: obj[[GeneratorState]] internal slotを持つ。
  4. obj.[[GeneratorState]]suspended-startなら、
    1. obj.[[GeneratorState]]completedに設定する。
    2. NOTE: generatorがcompleted stateに入ると、そこから離れることはなく、関連付けられたexecution contextは再開されない。この時点で、objに関連付けられた任意のexecution stateは破棄できる。
    3. IteratorCloseAll(obj.[[UnderlyingIterators]], NormalCompletion(unused))を実行する。
    4. CreateIteratorResultObject(undefined, true)を返す。
  5. completionReturnCompletion(undefined)とする。
  6. GeneratorResumeAbrupt(obj, completion, "Iterator Helper")を返す。

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "Iterator Helper"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.1.3 Iteratorオブジェクト

27.1.3.1 Iteratorコンストラクタ

Iterator constructorは:

  • %Iterator%である。
  • global object"Iterator" propertyのinitial valueである。
  • subclassableであるようにdesignedされている。class definitionのextends clauseのvalueとして使用してもよい。

27.1.3.1.1 Iterator ( )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. NewTargetがundefinedまたはactive function objectなら、TypeError例外をthrowする。
  2. OrdinaryCreateFromConstructor(NewTarget, "%Iterator.prototype%")を返す。

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

Iterator constructorは:

  • valueが%Function.prototype%である[[Prototype]] internal slotを持つ。
  • 以下のpropertiesを持つ:

27.1.3.2.1 Iterator.concat ( ...items )

  1. iterablesをnew empty Listとする。
  2. itemsの各element itemについて、
    1. itemがObjectでないなら、TypeError例外をthrowする。
    2. methodを ? GetMethod(item, %Symbol.iterator%) とする。
    3. methodundefinedなら、TypeError例外をthrowする。
    4. Record { [[OpenMethod]]: method, [[Iterable]]: item }をiterablesにappendする。
  3. closureを、iterablesをcaptureし、呼び出されたときに以下のstepsを実行する、parametersを持たないnew Abstract Closureとする:
    1. iterablesの各Record iterableについて、
      1. iteratorを ? Call(iterable.[[OpenMethod]], iterable.[[Iterable]]) とする。
      2. iteratorがObjectでないなら、TypeError例外をthrowする。
      3. iteratorRecordを ? GetIteratorDirect(iterator) とする。
      4. innerAlivetrueとする。
      5. innerAlivetrueである間、繰り返す:
        1. innerValueを ? IteratorStepValue(iteratorRecord) とする。
        2. innerValuedoneなら、
          1. innerAlivefalseに設定する。
        3. そうでなければ、
          1. completionCompletion(Yield(innerValue))とする。
          2. completionabrupt completionなら、
            1. IteratorClose(iteratorRecord, completion)を返す。
    2. ReturnCompletion(undefined)を返す。
  4. genCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)とする。
  5. gen.[[UnderlyingIterators]]をnew empty Listに設定する。
  6. genを返す。

27.1.3.2.2 Iterator.from ( obj )

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

27.1.3.2.2.1 %WrapForValidIteratorPrototype%オブジェクト

%WrapForValidIteratorPrototype% objectは:

27.1.3.2.2.1.1 %WrapForValidIteratorPrototype%.next ( )

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

27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )

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

27.1.3.2.3 Iterator.prototype

Iterator.prototypeのinitial valueはIterator prototype objectである。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

27.1.3.2.4 Iterator.zip ( iterables [ , options ] )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. iterablesがObjectでないなら、TypeError例外をthrowする。
  2. optionsを ? GetOptionsObject(options) に設定する。
  3. modeを ? Get(options, "mode") とする。
  4. modeundefinedなら、mode"shortest"に設定する。
  5. mode"shortest""longest"、または"strict"のいずれでもないなら、TypeError例外をthrowする。
  6. paddingOptionundefinedとする。
  7. mode"longest"なら、
    1. paddingOptionを ? Get(options, "padding") に設定する。
    2. paddingOptionundefinedでなく、かつObjectでないなら、TypeError例外をthrowする。
  8. itersをnew empty Listとする。
  9. paddingをnew empty Listとする。
  10. inputIterを ? GetIterator(iterables, sync) とする。
  11. nextnot-startedとする。
  12. nextdoneでない間、繰り返す:
    1. nextCompletion(IteratorStepValue(inputIter))に設定する。
    2. IfAbruptCloseIterators(next, iters).
    3. nextdoneでないなら、
      1. iterCompletion(GetIteratorFlattenable(next, reject-primitives))とする。
      2. needClosingを« inputIter »とiterslist-concatenationとする。
      3. IfAbruptCloseIterators(iter, needClosing).
      4. iteritersにappendする。
  13. iterCountitersのelements数とする。
  14. mode"longest"なら、
    1. paddingOptionundefinedなら、
      1. iterCount回繰り返す:
        1. undefinedpaddingにappendする。
    2. そうでなければ、
      1. paddingIterCompletion(GetIterator(paddingOption, sync))とする。
      2. IfAbruptCloseIterators(paddingIter, iters).
      3. usingIteratortrueとする。
      4. iterCount回繰り返す:
        1. usingIteratortrueなら、
          1. nextCompletion(IteratorStepValue(paddingIter))に設定する。
          2. IfAbruptCloseIterators(next, iters).
          3. nextdoneなら、
            1. usingIteratorfalseに設定する。
          4. そうでなければ、
            1. nextpaddingにappendする。
        2. usingIteratorfalseなら、undefinedpaddingにappendする。
      5. usingIteratortrueなら、
        1. completionCompletion(IteratorClose(paddingIter, NormalCompletion(unused)))とする。
        2. IfAbruptCloseIterators(completion, iters).
  15. finishResultsを、parameters (results)を持ち、何もcaptureせず、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. CreateArrayFromList(results)を返す。
  16. IteratorZip(iters, mode, padding, finishResults)を返す。

27.1.3.2.5 Iterator.zipKeyed ( iterables [ , options ] )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. iterablesがObjectでないなら、TypeError例外をthrowする。
  2. optionsを ? GetOptionsObject(options) に設定する。
  3. modeを ? Get(options, "mode") とする。
  4. modeundefinedなら、mode"shortest"に設定する。
  5. mode"shortest""longest"、または"strict"のいずれでもないなら、TypeError例外をthrowする。
  6. paddingOptionundefinedとする。
  7. mode"longest"なら、
    1. paddingOptionを ? Get(options, "padding") に設定する。
    2. paddingOptionundefinedでなく、かつObjectでないなら、TypeError例外をthrowする。
  8. itersをnew empty Listとする。
  9. paddingをnew empty Listとする。
  10. allKeysを ? iterables.[[OwnPropertyKeys]]() とする。
  11. keysをnew empty Listとする。
  12. allKeysの各element keyについて、
    1. propertyDescCompletion(iterables.[[GetOwnProperty]](key))とする。
    2. IfAbruptCloseIterators(propertyDesc, iters).
    3. propertyDescundefinedでなく、かつpropertyDesc.[[Enumerable]]trueなら、
      1. valueCompletion(Get(iterables, key))とする。
      2. IfAbruptCloseIterators(value, iters).
      3. valueundefinedでないなら、
        1. keykeysにappendする。
        2. iterCompletion(GetIteratorFlattenable(value, reject-primitives))とする。
        3. IfAbruptCloseIterators(iter, iters).
        4. iteritersにappendする。
  13. iterCountitersのelements数とする。
  14. mode"longest"なら、
    1. paddingOptionundefinedなら、
      1. iterCount回繰り返す:
        1. undefinedpaddingにappendする。
    2. そうでなければ、
      1. keysの各element keyについて、
        1. valueCompletion(Get(paddingOption, key))とする。
        2. IfAbruptCloseIterators(value, iters).
        3. valuepaddingにappendする。
  15. finishResultsを、parameters (results)を持ち、keysiterCountをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. objOrdinaryObjectCreate(null)とする。
    2. 0 ≤ i < iterCountである各integer iについて、昇順で、
      1. CreateDataPropertyOrThrow(obj, keys[i], results[i])を実行する。
    3. objを返す。
  16. IteratorZip(iters, mode, padding, finishResults)を返す。

27.1.3.3 Iterator Prototype Objectのプロパティ

Iterator prototype objectは:

Note

このspecificationでdefinedされる、iterator interfaceを実装するすべてのobjectsも%Iterator.prototype%からinheritする。ECMAScript codeも、%Iterator.prototype%からinheritするobjectsをdefineしてよい。%Iterator.prototype%は、すべてのiterator objectsに適用可能なadditional methodsを追加できる場所を提供する。

以下のexpressionは、ECMAScript codeが%Iterator.prototype% objectにaccessできる1つの方法である:

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

27.1.3.3.1 Iterator.prototype.constructor

Iterator.prototype.constructorは、attributes { [[Enumerable]]: false, [[Configurable]]: true }を持つaccessor propertyである。[[Get]]および[[Set]] attributesは以下のようにdefinedされる:

27.1.3.3.1.1 get Iterator.prototype.constructor

[[Get]] attributeのvalueは、argumentsを必要としないbuilt-in functionである。呼び出されたときに以下のstepsを実行する:

  1. %Iterator%を返す。

27.1.3.3.1.2 set Iterator.prototype.constructor

[[Set]] attributeのvalueは、argument vを取るbuilt-in functionである。呼び出されたときに以下のstepsを実行する:

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

ほとんどのbuilt-in prototypes上の"constructor" propertyとは異なり、web-compatibilityの理由により、このpropertyはaccessorでなければならない。

27.1.3.3.2 Iterator.prototype.drop ( limit )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. numberLimitCompletion(ToNumber(limit))とする。
  5. IfAbruptCloseIterator(numberLimit, iterated).
  6. numberLimitNaNなら、
    1. errorThrowCompletion(a newly created RangeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  7. intLimitを ! ToIntegerOrInfinity(numberLimit) とする。
  8. intLimit < 0なら、
    1. errorThrowCompletion(a newly created RangeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  9. iteratedを ? GetIteratorDirect(obj) に設定する。
  10. closureを、iteratedintLimitをcaptureし、呼び出されたときに以下のstepsを実行する、parametersを持たないnew Abstract Closureとする:
    1. remainingintLimitとする。
    2. remaining > 0である間、繰り返す:
      1. remaining ≠ +∞なら、
        1. remainingremaining - 1に設定する。
      2. nextを ? IteratorStep(iterated) とする。
      3. nextdoneなら、ReturnCompletion(undefined)を返す。
    3. 繰り返す:
      1. valueを ? IteratorStepValue(iterated) とする。
      2. valuedoneなら、ReturnCompletion(undefined)を返す。
      3. completionCompletion(Yield(value))とする。
      4. IfAbruptCloseIterator(completion, iterated).
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)とする。
  12. result.[[UnderlyingIterators]]を« iterated »に設定する。
  13. resultを返す。

27.1.3.3.3 Iterator.prototype.every ( predicate )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. IsCallable(predicate)がfalseなら、
    1. errorThrowCompletion(a newly created TypeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  5. iteratedを ? GetIteratorDirect(obj) に設定する。
  6. counterを0とする。
  7. 繰り返す:
    1. valueを ? IteratorStepValue(iterated) とする。
    2. valuedoneなら、trueを返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))とする。
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result)がfalseなら、? IteratorClose(iterated, NormalCompletion(false))を返す。
    6. countercounter + 1に設定する。

27.1.3.3.4 Iterator.prototype.filter ( predicate )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. IsCallable(predicate)がfalseなら、
    1. errorThrowCompletion(a newly created TypeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  5. iteratedを ? GetIteratorDirect(obj) に設定する。
  6. closureを、iteratedpredicateをcaptureし、呼び出されたときに以下のstepsを実行する、parametersを持たないnew Abstract Closureとする:
    1. counterを0とする。
    2. 繰り返す:
      1. valueを ? IteratorStepValue(iterated) とする。
      2. valuedoneなら、ReturnCompletion(undefined)を返す。
      3. selectedCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))とする。
      4. IfAbruptCloseIterator(selected, iterated).
      5. ToBoolean(selected)がtrueなら、
        1. completionCompletion(Yield(value))とする。
        2. IfAbruptCloseIterator(completion, iterated).
      6. countercounter + 1に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)とする。
  8. result.[[UnderlyingIterators]]を« iterated »に設定する。
  9. resultを返す。

27.1.3.3.5 Iterator.prototype.find ( predicate )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. IsCallable(predicate)がfalseなら、
    1. errorThrowCompletion(a newly created TypeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  5. iteratedを ? GetIteratorDirect(obj) に設定する。
  6. counterを0とする。
  7. 繰り返す:
    1. valueを ? IteratorStepValue(iterated) とする。
    2. valuedoneなら、undefinedを返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))とする。
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result)がtrueなら、? IteratorClose(iterated, NormalCompletion(value))を返す。
    6. countercounter + 1に設定する。

27.1.3.3.6 Iterator.prototype.flatMap ( mapper )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. IsCallable(mapper)がfalseなら、
    1. errorThrowCompletion(a newly created TypeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  5. iteratedを ? GetIteratorDirect(obj) に設定する。
  6. closureを、iteratedmapperをcaptureし、呼び出されたときに以下のstepsを実行する、parametersを持たないnew Abstract Closureとする:
    1. counterを0とする。
    2. 繰り返す:
      1. valueを ? IteratorStepValue(iterated) とする。
      2. valuedoneなら、ReturnCompletion(undefined)を返す。
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »))とする。
      4. IfAbruptCloseIterator(mapped, iterated).
      5. innerIteratorCompletion(GetIteratorFlattenable(mapped, reject-primitives))とする。
      6. IfAbruptCloseIterator(innerIterator, iterated).
      7. innerAlivetrueとする。
      8. innerAlivetrueである間、繰り返す:
        1. innerValueCompletion(IteratorStepValue(innerIterator))とする。
        2. IfAbruptCloseIterator(innerValue, iterated).
        3. innerValuedoneなら、
          1. innerAlivefalseに設定する。
        4. そうでなければ、
          1. completionCompletion(Yield(innerValue))とする。
          2. completionabrupt completionなら、
            1. backupCompletionCompletion(IteratorClose(innerIterator, completion))とする。
            2. IfAbruptCloseIterator(backupCompletion, iterated).
            3. IteratorClose(iterated, completion)を返す。
      9. countercounter + 1に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)とする。
  8. result.[[UnderlyingIterators]]を« iterated »に設定する。
  9. resultを返す。

27.1.3.3.7 Iterator.prototype.forEach ( procedure )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. IsCallable(procedure)がfalseなら、
    1. errorThrowCompletion(a newly created TypeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  5. iteratedを ? GetIteratorDirect(obj) に設定する。
  6. counterを0とする。
  7. 繰り返す:
    1. valueを ? IteratorStepValue(iterated) とする。
    2. valuedoneなら、undefinedを返す。
    3. resultCompletion(Call(procedure, undefined, « value, 𝔽(counter) »))とする。
    4. IfAbruptCloseIterator(result, iterated).
    5. countercounter + 1に設定する。

27.1.3.3.8 Iterator.prototype.map ( mapper )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. IsCallable(mapper)がfalseなら、
    1. errorThrowCompletion(a newly created TypeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  5. iteratedを ? GetIteratorDirect(obj) に設定する。
  6. closureを、iteratedmapperをcaptureし、呼び出されたときに以下のstepsを実行する、parametersを持たないnew Abstract Closureとする:
    1. counterを0とする。
    2. 繰り返す:
      1. valueを ? IteratorStepValue(iterated) とする。
      2. valuedoneなら、ReturnCompletion(undefined)を返す。
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »))とする。
      4. IfAbruptCloseIterator(mapped, iterated).
      5. completionCompletion(Yield(mapped))とする。
      6. IfAbruptCloseIterator(completion, iterated).
      7. countercounter + 1に設定する。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)とする。
  8. result.[[UnderlyingIterators]]を« iterated »に設定する。
  9. resultを返す。

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

このmethodは、呼び出されたときに以下のstepsを実行する:

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

27.1.3.3.10 Iterator.prototype.some ( predicate )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. IsCallable(predicate)がfalseなら、
    1. errorThrowCompletion(a newly created TypeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  5. iteratedを ? GetIteratorDirect(obj) に設定する。
  6. counterを0とする。
  7. 繰り返す:
    1. valueを ? IteratorStepValue(iterated) とする。
    2. valuedoneなら、falseを返す。
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))とする。
    4. IfAbruptCloseIterator(result, iterated).
    5. ToBoolean(result)がtrueなら、? IteratorClose(iterated, NormalCompletion(true))を返す。
    6. countercounter + 1に設定する。

27.1.3.3.11 Iterator.prototype.take ( limit )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }とする。
  4. numberLimitCompletion(ToNumber(limit))とする。
  5. IfAbruptCloseIterator(numberLimit, iterated).
  6. numberLimitNaNなら、
    1. errorThrowCompletion(a newly created RangeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  7. intLimitを ! ToIntegerOrInfinity(numberLimit) とする。
  8. intLimit < 0なら、
    1. errorThrowCompletion(a newly created RangeError object)とする。
    2. IteratorClose(iterated, error)を返す。
  9. iteratedを ? GetIteratorDirect(obj) に設定する。
  10. closureを、iteratedintLimitをcaptureし、呼び出されたときに以下のstepsを実行する、parametersを持たないnew Abstract Closureとする:
    1. remainingintLimitとする。
    2. 繰り返す:
      1. remaining = 0なら、
        1. IteratorClose(iterated, ReturnCompletion(undefined))を返す。
      2. remaining ≠ +∞なら、
        1. remainingremaining - 1に設定する。
      3. valueを ? IteratorStepValue(iterated) とする。
      4. valuedoneなら、ReturnCompletion(undefined)を返す。
      5. completionCompletion(Yield(value))とする。
      6. IfAbruptCloseIterator(completion, iterated).
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)とする。
  12. result.[[UnderlyingIterators]]を« iterated »に設定する。
  13. resultを返す。

27.1.3.3.12 Iterator.prototype.toArray ( )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. objthis valueとする。
  2. objがObjectでないなら、TypeError例外をthrowする。
  3. iteratedを ? GetIteratorDirect(obj) とする。
  4. itemsをnew empty Listとする。
  5. 繰り返す:
    1. valueを ? IteratorStepValue(iterated) とする。
    2. valuedoneなら、CreateArrayFromList(items)を返す。
    3. valueitemsにappendする。

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

このメソッドは、呼び出されたときに次のステップを実行する:

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

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

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

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. this valueを返す。

このfunctionの"name" propertyのvalueは"[Symbol.iterator]"である。

27.1.3.3.15 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%]は、attributes { [[Enumerable]]: false, [[Configurable]]: true }を持つaccessor propertyである。[[Get]]および[[Set]] attributesは以下のようにdefinedされる:

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

[[Get]] attributeのvalueは、argumentsを必要としないbuilt-in functionである。呼び出されたときに以下のstepsを実行する:

  1. "Iterator"を返す。

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

[[Set]] attributeのvalueは、argument vを取るbuilt-in functionである。呼び出されたときに以下のstepsを実行する:

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

ほとんどのbuilt-in prototypes上の%Symbol.toStringTag% propertyとは異なり、web-compatibilityの理由により、このpropertyはaccessorでなければならない。

27.1.3.4 IteratorsのためのAbstract Operations

27.1.3.4.1 IteratorZip ( iters, mode, padding, finishResults )

The abstract operation IteratorZip takes arguments iters (a List of Iterator Records), mode ("shortest", "longest", or "strict"), padding (a List of ECMAScript language values), and finishResults (an Abstract Closure that takes a List of ECMAScript language values and returns an ECMAScript language value) and returns a Generator. It performs the following steps when called:

  1. iterCountitersのelements数とする。
  2. openItersitersのcopyとする。
  3. closureを、itersiterCountopenItersmodepadding、およびfinishResultsをcaptureし、呼び出されたときに以下のstepsを実行する、parametersを持たないnew Abstract Closureとする:
    1. iterCount = 0なら、ReturnCompletion(undefined)を返す。
    2. 繰り返す:
      1. resultsをnew empty Listとする。
      2. Assert: openItersはemptyでない。
      3. 0 ≤ i < iterCountである各integer iについて、昇順で、
        1. iteriters[i]とする。
        2. iternullなら、
          1. Assert: mode"longest"である。
          2. resultpadding[i]とする。
        3. そうでなければ、
          1. resultCompletion(IteratorStepValue(iter))とする。
          2. resultabrupt completionなら、
            1. openItersからiterをremoveする。
            2. IteratorCloseAll(openIters, result)を返す。
          3. resultを ! result に設定する。
          4. resultdoneなら、
            1. openItersからiterをremoveする。
            2. mode"shortest"なら、
              1. IteratorCloseAll(openIters, ReturnCompletion(undefined))を返す。
            3. そうでなく、mode"strict"なら、
              1. i ≠ 0なら、
                1. IteratorCloseAll(openIters, ThrowCompletion(a newly created TypeError object))を返す。
              2. 1 ≤ k < iterCountである各integer kについて、昇順で、
                1. Assert: iters[k]はnullでない。
                2. openCompletion(IteratorStep(iters[k]))とする。
                3. openabrupt completionなら、
                  1. openItersからiters[k]をremoveする。
                  2. IteratorCloseAll(openIters, open)を返す。
                4. openを ! open に設定する。
                5. opendoneなら、
                  1. openItersからiters[k]をremoveする。
                6. そうでなければ、
                  1. IteratorCloseAll(openIters, ThrowCompletion(a newly created TypeError object))を返す。
              3. ReturnCompletion(undefined)を返す。
            4. そうでなければ、
              1. Assert: mode"longest"である。
              2. openItersがemptyなら、ReturnCompletion(undefined)を返す。
              3. iters[i]をnullに設定する。
              4. resultpadding[i]に設定する。
        4. resultresultsにappendする。
      4. resultsfinishResults(results)に設定する。
      5. completionCompletion(Yield(results))とする。
      6. IfAbruptCloseIterators(completion, openIters).
  4. genCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)とする。
  5. gen.[[UnderlyingIterators]]openItersに設定する。
  6. genを返す。

27.1.4 %AsyncIteratorPrototype%オブジェクト

%AsyncIteratorPrototype% objectは:

Note

このspecificationでdefinedされる、async iterator interfaceを実装するすべてのobjectsも%AsyncIteratorPrototype%からinheritする。ECMAScript codeも、%AsyncIteratorPrototype%からinheritするobjectsをdefineしてよい。%AsyncIteratorPrototype% objectは、すべてのasync iterator objectsに適用可能なadditional methodsを追加できる場所を提供する。

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

このメソッドは、呼び出されたときに次のステップを実行する:

  1. objthis 値とする。
  2. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  3. returnCompletion(GetMethod(obj, "return"))) とする。
  4. IfAbruptRejectPromise(return, promiseCapability).
  5. returnundefined である場合、then
    1. Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行する。
  6. Else,
    1. resultCompletion(Call(return, obj, « »)) とする。
    2. IfAbruptRejectPromise(result, promiseCapability).
    3. resultWrapperCompletion(PromiseResolve(%Promise%, result)) とする。
    4. IfAbruptRejectPromise(resultWrapper, promiseCapability).
    5. unwrap を、何もキャプチャせず、呼び出されたときに次のステップを実行する、パラメータを持たない新しい Abstract Closure とする:
      1. undefined を返す。
    6. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « ») とする。
    7. PerformPromiseThen(resultWrapper, onFulfilled, undefined, promiseCapability) を実行する。
  7. promiseCapability.[[Promise]] を返す。

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

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

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. this valueを返す。

このfunctionの"name" propertyのvalueは"[Symbol.asyncIterator]"である。

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

Async-from-Sync Iterator objectは、特定のsynchronous iteratorをadaptするasync iteratorである。Async-from-Sync Iterator objectsは、ECMAScript codeから直接accessされることは決してない。Async-from-Sync Iterator objectsにはnamed constructorは存在しない。代わりに、Async-from-Sync Iterator objectsは必要に応じてCreateAsyncFromSyncIterator abstract operationによって作成される。

27.1.5.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

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

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

27.1.5.2 %AsyncFromSyncIteratorPrototype%オブジェクト

%AsyncFromSyncIteratorPrototype% objectは:

27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

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

27.1.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. objthis valueとする。
  2. Assert: obj[[SyncIteratorRecord]] internal slotを持つObjectである。
  3. promiseCapabilityを ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]]とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]]とする。
  6. returnCompletion(GetMethod(syncIterator, "return"))とする。
  7. IfAbruptRejectPromise(return, promiseCapability).
  8. returnundefinedなら、
    1. iteratorResultCreateIteratorResultObject(value, true)とする。
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)を実行する。
    3. promiseCapability.[[Promise]]を返す。
  9. valueが存在するなら、
    1. resultCompletion(Call(return, syncIterator, « value »))とする。
  10. そうでなければ、
    1. resultCompletion(Call(return, syncIterator))とする。
  11. IfAbruptRejectPromise(result, promiseCapability).
  12. resultがObjectでないなら、
    1. Call(promiseCapability.[[Reject]], undefined, « a newly created TypeError object »)を実行する。
    2. promiseCapability.[[Promise]]を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, false)を返す。

27.1.5.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

Note
このspecificationでは、valueは常に提供されるが、%AsyncFromSyncIteratorPrototype%.return ( [ value ] )との一貫性のためにoptionalのままにされている。
  1. objthis valueとする。
  2. Assert: obj[[SyncIteratorRecord]] internal slotを持つObjectである。
  3. promiseCapabilityを ! NewPromiseCapability(%Promise%) とする。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]]とする。
  5. syncIteratorsyncIteratorRecord.[[Iterator]]とする。
  6. throwCompletion(GetMethod(syncIterator, "throw"))とする。
  7. IfAbruptRejectPromise(throw, promiseCapability).
  8. throwundefinedなら、
    1. NOTE: syncIteratorthrow methodがない場合、capabilityをrejectする前にcleanupの機会を与えるためにそれをcloseする。
    2. closeCompletionNormalCompletion(empty)とする。
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion))とする。
    4. IfAbruptRejectPromise(result, promiseCapability).
    5. NOTE: 次のstepは、protocol violationがあったことを示すためにTypeErrorをthrowする:syncIteratorthrow methodを持たない。
    6. NOTE: syncIteratorのclosingがthrowしない場合、そのoperationのresultは、それがrejected promiseをyieldする場合であっても無視される。
    7. Call(promiseCapability.[[Reject]], undefined, « a newly created TypeError object »)を実行する。
    8. promiseCapability.[[Promise]]を返す。
  9. valueが存在するなら、
    1. resultCompletion(Call(throw, syncIterator, « value »))とする。
  10. そうでなければ、
    1. resultCompletion(Call(throw, syncIterator))とする。
  11. IfAbruptRejectPromise(result, promiseCapability).
  12. resultがObjectでないなら、
    1. Call(promiseCapability.[[Reject]], undefined, « a newly created TypeError object »)を実行する。
    2. promiseCapability.[[Promise]]を返す。
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true)を返す。

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

Async-from-Sync Iterator instancesは、%AsyncFromSyncIteratorPrototype% intrinsic objectからpropertiesをinheritするordinary objectsである。Async-from-Sync Iterator instancesは、最初にTable 86に列挙されるinternal slotsで作成される。

Table 86: Internal Slots of Async-from-Sync Iterator Instances
Internal Slot Type Description
[[SyncIteratorRecord]] Iterator Record adaptされているoriginal synchronous iteratorを表す。

27.1.5.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

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

  1. NOTE: promiseCapabilityはintrinsic %Promise%からderivedされるため、下記のIfAbruptRejectPromiseの使用によって必要となるpromiseCapability.[[Reject]]へのcallsは、throwしないことがguaranteedされる。
  2. doneCompletion(IteratorComplete(result))とする。
  3. IfAbruptRejectPromise(done, promiseCapability).
  4. valueCompletion(IteratorValue(result))とする。
  5. IfAbruptRejectPromise(value, promiseCapability).
  6. valueWrapperCompletion(PromiseResolve(%Promise%, value))とする。
  7. valueWrapperabrupt completionで、donefalseで、closeOnRejectiontrueなら、
    1. valueWrapperCompletion(IteratorClose(syncIteratorRecord, valueWrapper))に設定する。
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability).
  9. unwrapを、parameters (v)を持ち、doneをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. CreateIteratorResultObject(v, done)を返す。
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « »)とする。
  11. NOTE: onFulfilledは、IteratorResult object"value" propertyを処理するとき、そのvalueがpromiseである場合にそれを待ち、resultを新しい“unwrapped” IteratorResult objectに再packageするために使用される。
  12. donetrueまたはcloseOnRejectionfalseなら、
    1. onRejectedundefinedとする。
  13. そうでなければ、
    1. closeIteratorを、parameters (error)を持ち、syncIteratorRecordをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
      1. IteratorClose(syncIteratorRecord, ThrowCompletion(error))を返す。
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « »)とする。
    3. NOTE: onRejectedは、IteratorがyieldするIteratorResult object"value" propertyがrejected promiseである場合に、そのIteratorをcloseするために使用される。
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability)を実行する。
  15. promiseCapability.[[Promise]]を返す。

27.2 リソース管理

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

27.2.1.1 Disposable インターフェイス

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

Table 87: Disposable インターフェイスの必須プロパティ
プロパティ 要件
%Symbol.dispose% 関数オブジェクト

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

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

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

27.2.1.2 AsyncDisposable インターフェイス

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

Table 88: AsyncDisposable インターフェイスの必須プロパティ
プロパティ 要件
%Symbol.asyncDispose% promise を返す関数オブジェクト

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

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

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

27.3 DisposableStack オブジェクト

DisposableStack は、まとめて破棄されるべき1つ以上のリソースを格納するために使用できるオブジェクトである。

任意の DisposableStack オブジェクトは、互いに排他的な2つの状態、すなわち disposed または pending のいずれかにある。disposable stack d は、d.dispose()d.move()d に対して呼び出されていない場合に限り 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 プロトタイプオブジェクトである。

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

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

DisposableStack プロトタイプオブジェクトは次のとおりである:

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

27.3.3.1 DisposableStack.prototype.adopt ( value, onDispose )

このメソッドは、呼び出されたときに次のステップを実行する:

  1. disposableStackthis 値とする。
  2. RequireInternalSlot(disposableStack, [[DisposableState]]) を実行する。
  3. disposableStack.[[DisposableState]]disposed である場合、ReferenceError 例外を投げる。
  4. IsCallable(onDispose) が false である場合、TypeError 例外を投げる。
  5. closure を、valueonDispose をキャプチャし、呼び出されたときに次のステップを実行する、パラメータを持たない新しい Abstract Closure とする:
    1. Return ? Call(onDispose, undefined, « value »).
  6. funcCreateBuiltinFunction(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. disposableStackthis 値とする。
  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. disposableStackthis 値とする。
  2. RequireInternalSlot(disposableStack, [[DisposableState]]) を実行する。
  3. disposableStack.[[DisposableState]]disposed である場合、undefined を返す。
  4. disposableStack.[[DisposableState]]disposed に設定する。
  5. Return ? DisposeResources(disposableStack.[[DisposableResourceStack]], NormalCompletion(undefined)).

27.3.3.5 get DisposableStack.prototype.disposed

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

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

27.3.3.6 DisposableStack.prototype.move ( )

このメソッドは、呼び出されたときに次のステップを実行する:

  1. disposableStackthis 値とする。
  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. disposableStackthis 値とする。
  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 プロトタイプオブジェクト(組込み %DisposableStack.prototype%)からプロパティを継承する通常のオブジェクトである。DisposableStack インスタンスは、最初に Table 89 に記述される内部スロットを持つように作成される。

Table 89: DisposableStack インスタンスの内部スロット
内部スロット 説明
[[DisposableState]] pending または disposed disposable stack が自身の %Symbol.dispose% メソッドへの着信呼び出しにどのように反応するかを制御する。
[[DisposableResourceStack]] DisposableResource レコードList disposable stack が破棄されるときに破棄されるリソース。リソースは初期化された順に追加され、逆順に破棄される。

27.4 AsyncDisposableStack オブジェクト

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

任意の AsyncDisposableStack オブジェクトは、互いに排他的な2つの状態、すなわち disposed または pending のいずれかにある。async-disposable stack d は、d.disposeAsync()d.move()d に対して呼び出されていない場合に限り 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 プロトタイプオブジェクトである。

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

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

AsyncDisposableStack プロトタイプオブジェクトは次のとおりである:

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

27.4.3.1 AsyncDisposableStack.prototype.adopt ( value, onDisposeAsync )

このメソッドは、呼び出されたときに次のステップを実行する:

  1. asyncDisposableStackthis 値とする。
  2. RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]]) を実行する。
  3. asyncDisposableStack.[[AsyncDisposableState]]disposed である場合、ReferenceError 例外を投げる。
  4. IsCallable(onDisposeAsync) が false である場合、TypeError 例外を投げる。
  5. closure を、valueonDisposeAsync をキャプチャし、呼び出されたときに次のステップを実行する、パラメータを持たない新しい Abstract Closure とする:
    1. Return ? Call(onDisposeAsync, undefined, « value »).
  6. funcCreateBuiltinFunction(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. asyncDisposableStackthis 値とする。
  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. asyncDisposableStackthis 値とする。
  2. RequireInternalSlot(asyncDisposableStack, [[AsyncDisposableState]]) を実行する。
  3. asyncDisposableStack.[[AsyncDisposableState]]disposed である場合、undefined を返す。
  4. asyncDisposableStack.[[AsyncDisposableState]]disposed に設定する。
  5. Return ? DisposeResources(asyncDisposableStack.[[DisposableResourceStack]], NormalCompletion(undefined)).

27.4.3.5 get AsyncDisposableStack.prototype.disposed

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

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

27.4.3.6 AsyncDisposableStack.prototype.move ( )

このメソッドは、呼び出されたときに次のステップを実行する:

  1. asyncDisposableStackthis 値とする。
  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. asyncDisposableStackthis 値とする。
  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 プロトタイプオブジェクト(組込み %AsyncDisposableStack.prototype%)からプロパティを継承する通常のオブジェクトである。AsyncDisposableStack インスタンスは、最初に Table 90 に記述される内部スロットを持つように作成される。

Table 90: AsyncDisposableStack インスタンスの内部スロット
内部スロット 説明
[[AsyncDisposableState]] pending または disposed disposable stack が自身の %Symbol.asyncDispose% メソッドへの着信呼び出しにどのように反応するかを制御する。
[[DisposableResourceStack]] DisposableResource レコードList disposable stack が破棄されるときに破棄されるリソース。リソースは初期化された順に追加され、逆順に破棄される。

27.5 Promiseオブジェクト

Promiseは、遅延された(かつ場合によっては非同期の)計算の最終的な結果のplaceholderとして使用されるobjectである。

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

  • promise pは、p.then(f, r)がfunction fをcallするJobをただちにenqueueするならfulfilledである。
  • promise pは、p.then(f, r)がfunction rをcallするJobをただちにenqueueするならrejectedである。
  • promiseは、fulfilledでもrejectedでもないならpendingである。

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

promiseは、settledであるか、または別のpromiseのstateと一致するように“locked in”されているなら、resolvedである。resolved promiseをresolveまたはrejectしようとしても効果はない。promiseは、resolvedでないならunresolvedである。unresolved promiseは常にpending stateにある。resolved promiseはpending、fulfilled、またはrejectedでありうる。

27.5.1 Promise Abstract Operations

27.5.1.1 PromiseCapability Records

PromiseCapability Recordは、Promiseまたはpromise-like objectを、そのpromiseをresolveまたはrejectできるfunctionsとともにencapsulateするために使用されるRecord valueである。PromiseCapability Recordsは、NewPromiseCapability abstract operationによって生成される。

PromiseCapability Recordsは、Table 91に列挙されるfieldsを持つ。

Table 91: PromiseCapability Record Fields
Field Name Value Meaning
[[Promise]] Object promiseとして使用可能なobject。
[[Resolve]] function object 与えられたpromiseをresolveするために使用されるfunction。
[[Reject]] function object 与えられたpromiseをrejectするために使用されるfunction。

27.5.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromiseは、PromiseCapability Recordを使用するalgorithm stepsのsequenceに対するshorthandである。次の形式のalgorithm step:

  1. IfAbruptRejectPromise(value, capability).

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

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

27.5.1.2 PromiseReaction Records

PromiseReaction Recordは、promiseが与えられたvalueでresolvedまたはrejectedになったときに、どのようにreactすべきかについての情報を格納するために使用されるRecord valueである。PromiseReaction RecordsはPerformPromiseThen abstract operationによって作成され、NewPromiseReactionJobによって返されるAbstract Closureによって使用される。

PromiseReaction Recordsは、Table 92に列挙されるfieldsを持つ。

Table 92: PromiseReaction Record Fields
Field Name Value Meaning
[[Capability]] PromiseCapability Recordまたはundefined このrecordがreaction handlerを提供するpromiseのcapabilities。
[[Type]] fulfillまたはreject [[Type]]は、[[Handler]]emptyであるときに、settlement typeに固有のbehaviourを可能にするために使用される。
[[Handler]] JobCallback Recordまたはempty incoming valueに適用されるべきfunctionであり、そのreturn valueがderived promiseに何が起こるかをgovernする。[[Handler]]emptyである場合、代わりに[[Type]]のvalueに依存するfunctionが使用される。

27.5.1.3 CreateResolvingFunctions ( toResolve )

The abstract operation CreateResolvingFunctions takes argument toResolve (a Promise) and returns a Record with fields [[Resolve]] (a function object) and [[Reject]] (a function object). It performs the following steps when called:

  1. promiseOrEmptyRecord { [[Value]]: toResolve }とする。
  2. resolveStepsを、parameters (resolution)を持ち、promiseOrEmptyをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. promiseOrEmpty.[[Value]]emptyなら、undefinedを返す。
    2. promisepromiseOrEmpty.[[Value]]とする。
    3. promiseOrEmpty.[[Value]]emptyに設定する。
    4. SameValue(resolution, promise)がtrueなら、
      1. selfResolutionErrorをnewly created TypeError objectとする。
      2. RejectPromise(promise, selfResolutionError)を実行する。
      3. undefinedを返す。
    5. resolutionがObjectでないなら、
      1. FulfillPromise(promise, resolution)を実行する。
      2. undefinedを返す。
    6. thenCompletion(Get(resolution, "then"))とする。
    7. thenabrupt completionなら、
      1. RejectPromise(promise, then.[[Value]])を実行する。
      2. undefinedを返す。
    8. thenActionthen.[[Value]]とする。
    9. IsCallable(thenAction)がfalseなら、
      1. FulfillPromise(promise, resolution)を実行する。
      2. undefinedを返す。
    10. thenJobCallbackHostMakeJobCallback(thenAction)とする。
    11. jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback)とする。
    12. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]])を実行する。
    13. undefinedを返す。
  3. resolveCreateBuiltinFunction(resolveSteps, 1, "", « »)とする。
  4. rejectStepsを、parameters (reason)を持ち、promiseOrEmptyをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. promiseOrEmpty.[[Value]]emptyなら、undefinedを返す。
    2. promisepromiseOrEmpty.[[Value]]とする。
    3. promiseOrEmpty.[[Value]]emptyに設定する。
    4. RejectPromise(promise, reason)を実行する。
    5. undefinedを返す。
  5. rejectCreateBuiltinFunction(rejectSteps, 1, "", « »)とする。
  6. Record { [[Resolve]]: resolve, [[Reject]]: reject }を返す。

27.5.1.4 FulfillPromise ( promise, value )

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

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

27.5.1.5 NewPromiseCapability ( ctor )

The abstract operation NewPromiseCapability takes argument ctor (an ECMAScript language value) and returns either a normal completion containing a PromiseCapability Record or a throw completion. これは、built-in Promise constructorの方式でctorconstructorとして使用し、promiseをcreateしてそのresolveおよびreject functionsをextractしようとする。promiseとresolveおよびreject functionsは、new PromiseCapability Recordをinitializeするために使用される。 It performs the following steps when called:

  1. IsConstructor(ctor)がfalseなら、TypeError例外をthrowする。
  2. NOTE: ctorは、Promise constructorのparameter conventionsをsupportするconstructor functionであるとassumedされる(27.5.3.1を参照)。
  3. resolvingFuncsRecord { [[Resolve]]: undefined, [[Reject]]: undefined }とする。
  4. executorClosureを、parameters (resolve, reject)を持ち、resolvingFuncsをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. resolvingFuncs.[[Resolve]]undefinedでないなら、TypeError例外をthrowする。
    2. resolvingFuncs.[[Reject]]undefinedでないなら、TypeError例外をthrowする。
    3. resolvingFuncs.[[Resolve]]resolveに設定する。
    4. resolvingFuncs.[[Reject]]rejectに設定する。
    5. NormalCompletion(undefined)を返す。
  5. executorCreateBuiltinFunction(executorClosure, 2, "", « »)とする。
  6. promiseを ? Construct(ctor, « executor ») とする。
  7. IsCallable(resolvingFuncs.[[Resolve]])がfalseなら、TypeError例外をthrowする。
  8. IsCallable(resolvingFuncs.[[Reject]])がfalseなら、TypeError例外をthrowする。
  9. PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFuncs.[[Resolve]], [[Reject]]: resolvingFuncs.[[Reject]] }を返す。
Note

このabstract operationはPromise subclassingをsupportする。これは、Promise constructorと同じ方法で渡されたexecutor function argumentをcallする任意のconstructorに対してgenericであるためである。これは、Promise constructorのstatic methodsを任意のsubclassにgeneralizeするために使用される。

27.5.1.6 IsPromise ( arg )

The abstract operation IsPromise takes argument arg (an ECMAScript language value) and returns a Boolean. これはobject上のpromise brandをcheckする。 It performs the following steps when called:

  1. argがObjectでないなら、falseを返す。
  2. arg[[PromiseState]] internal slotを持たないなら、falseを返す。
  3. trueを返す。

27.5.1.7 RejectPromise ( promise, reason )

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

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

27.5.1.8 TriggerPromiseReactions ( reactions, arg )

The abstract operation TriggerPromiseReactions takes arguments reactions (a List of PromiseReaction Records) and arg (an ECMAScript language value) and returns unused. これはreactions内の各recordについてnew Jobをenqueueする。そのような各JobPromiseReaction Record[[Type]]および[[Handler]]をprocessし、[[Handler]]emptyでない場合、与えられたargumentを渡してそれをcallする。[[Handler]]emptyである場合、behaviourは[[Type]]によってdeterminedされる。 It performs the following steps when called:

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

27.5.1.9 HostPromiseRejectionTracker ( promise, operation )

The host-defined abstract operation HostPromiseRejectionTracker takes arguments promise (a Promise) and operation ("reject" or "handle") and returns unused. これはhost environmentsがpromise rejectionsをtrackできるようにする。

HostPromiseRejectionTrackerのdefault implementationはunusedを返すことである。

Note 1

HostPromiseRejectionTrackerは2つのscenariosでcallされる:

  • promiseがhandlersなしでrejectedされるとき、operation argumentを"reject"に設定してcallされる。
  • rejected promiseに初めてhandlerが追加されるとき、operation argumentを"handle"に設定してcallされる。

HostPromiseRejectionTrackerの典型的なimplementationは、unhandled rejectionsをdevelopersに通知しようとしつつ、そのような以前のnotificationsが後から新しいhandlersのattachによってinvalidatedされる場合にも通知するよう注意するかもしれない。

Note 2

operation"handle"である場合、implementationはgarbage collectionを妨げるような方法でpromiseへのreferenceを保持すべきではない。operation"reject"である場合、rejectionsはrareでありhot code paths上にはないとexpectedされるため、implementationはpromiseへのreferenceを保持してもよい。

27.5.2 Promise Jobs

27.5.2.1 NewPromiseReactionJob ( reaction, arg )

The abstract operation NewPromiseReactionJob takes arguments reaction (a PromiseReaction Record) and arg (an ECMAScript language value) and returns a Record with fields [[Job]] (a Job Abstract Closure) and [[Realm]] (a Realm Record or null). これはincoming valueに適切なhandlerを適用し、そのhandlerのreturn valueを使用してそのhandlerに関連付けられたderived promiseをresolveまたはrejectするnew Job Abstract Closureを返す。 It performs the following steps when called:

  1. jobを、parametersを持たず、reactionおよびargをcaptureし、呼び出されたときに以下のstepsを実行するnew Job Abstract Closureとする:
    1. promiseCapabilityreaction.[[Capability]]とする。
    2. typereaction.[[Type]]とする。
    3. handlerreaction.[[Handler]]とする。
    4. handleremptyなら、
      1. typefulfillなら、
        1. handlerResultNormalCompletion(arg)とする。
      2. そうでなければ、
        1. Assert: typerejectである。
        2. handlerResultThrowCompletion(arg)とする。
    5. そうでなければ、
      1. handlerResultCompletion(HostCallJobCallback(handler, undefined, « arg »))とする。
    6. promiseCapabilityundefinedなら、
      1. Assert: handlerResultabrupt completionでない。
      2. emptyを返す。
    7. Assert: promiseCapabilityPromiseCapability Recordである。
    8. handlerResultabrupt completionなら、
      1. Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] »)を返す。
    9. Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] »)を返す。
  2. handlerRealmnullとする。
  3. reaction.[[Handler]]emptyでないなら、
    1. getHandlerRealmResultCompletion(GetFunctionRealm(reaction.[[Handler]].[[Callback]]))とする。
    2. getHandlerRealmResultnormal completionなら、handlerRealmgetHandlerRealmResult.[[Value]]に設定する。
    3. そうでなければ、handlerRealmcurrent Realm Recordに設定する。
    4. NOTE: handlerがundefinedでない限り、handlerRealmは決してnullではない。handlerがrevoked ProxyでありECMAScript codeが実行されない場合、handlerRealmはerror objectsをcreateするために使用される。
  4. Record { [[Job]]: job, [[Realm]]: handlerRealm }を返す。

27.5.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

The abstract operation NewPromiseResolveThenableJob takes arguments promiseToResolve (a Promise), thenable (an Object), and then (a JobCallback Record) and returns a Record with fields [[Job]] (a Job Abstract Closure) and [[Realm]] (a Realm Record). It performs the following steps when called:

  1. jobを、parametersを持たず、promiseToResolvethenable、およびthenをcaptureし、呼び出されたときに以下のstepsを実行するnew Job Abstract Closureとする:
    1. resolvingFuncsCreateResolvingFunctions(promiseToResolve)とする。
    2. thenCallResultCompletion(HostCallJobCallback(then, thenable, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »))とする。
    3. thenCallResultabrupt completionなら、
      1. Call(resolvingFuncs.[[Reject]], undefined, « thenCallResult.[[Value]] »)を返す。
    4. thenCallResultを返す。
  2. getThenRealmResultCompletion(GetFunctionRealm(then.[[Callback]]))とする。
  3. getThenRealmResultnormal completionなら、thenRealmgetThenRealmResult.[[Value]]とする。
  4. そうでなければ、thenRealmcurrent Realm Recordとする。
  5. NOTE: thenRealmは決してnullではない。then.[[Callback]]がrevoked Proxyでありcodeが実行されない場合、thenRealmはerror objectsをcreateするために使用される。
  6. Record { [[Job]]: job, [[Realm]]: thenRealm }を返す。
Note

このJobは、supplied thenableおよびそのthen methodを使用して、与えられたpromiseをresolveする。このprocessは、then methodのevaluationが任意のsurrounding codeのevaluationが完了した後に発生することをensureするため、Jobとして行われなければならない。

27.5.3 Promiseコンストラクタ

Promise constructorは:

  • %Promise%である。
  • global object"Promise" propertyのinitial valueである。
  • constructorとして呼び出されたときにnew Promiseをcreateしてinitializeする。
  • functionとして呼び出されることを意図しておらず、そのように呼び出された場合はexceptionをthrowする。
  • クラス定義の extends 句内の値として使用できる。指定された Promise の動作を継承しようとするサブクラスコンストラクターは、Promise および Promise.prototype の組み込みメソッドをサポートするために必要な内部状態でサブクラスインスタンスを作成し初期化するため、Promise コンストラクターへの super 呼び出しを含めなければならない。

27.5.3.1 Promise ( executor )

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. NewTargetがundefinedなら、TypeError例外をthrowする。
  2. IsCallable(executor)がfalseなら、TypeError例外をthrowする。
  3. promiseを ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») とする。
  4. promise.[[PromiseState]]pendingに設定する。
  5. promise.[[PromiseResult]]emptyに設定する。
  6. promise.[[PromiseFulfillReactions]]をnew empty Listに設定する。
  7. promise.[[PromiseRejectReactions]]をnew empty Listに設定する。
  8. promise.[[PromiseIsHandled]]falseに設定する。
  9. resolvingFuncsCreateResolvingFunctions(promise)とする。
  10. completionCompletion(Call(executor, undefined, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »))とする。
  11. completionabrupt completionなら、
    1. Call(resolvingFuncs.[[Reject]], undefined, « completion.[[Value]] »)を実行する。
  12. promiseを返す。
Note

executor argumentはfunction objectでなければならない。これは、このPromiseによって表される、場合によってはdeferredされたactionの開始および完了報告のためにcallされる。executorは2つのarguments、resolverejectでcallされる。これらは、deferred computationの最終的なcompletionまたはfailureを報告するためにexecutor functionによって使用されうるfunctionsである。executor functionからreturnすることは、deferred actionが完了したことを意味するのではなく、deferred actionを最終的にperformするrequestがacceptedされたことだけを意味する。

executor functionに渡されるresolve functionは、single argumentを受け入れる。executor codeは最終的にresolve functionをcallして、関連付けられたPromiseをresolveしたいことを示してもよい。resolve functionに渡されるargumentは、deferred actionの最終的なvalueを表し、実際のfulfillment valueまたはfulfilledされた場合にvalueを提供する別のpromiseのいずれかでありうる。

executor functionに渡されるreject functionは、single argumentを受け入れる。executor codeは最終的にreject functionをcallして、関連付けられたPromiseがrejectedされ、決してfulfilledされないことを示してもよい。reject functionに渡されるargumentは、promiseのrejection valueとして使用される。典型的にはError objectである。

Promise constructorによってexecutor functionに渡されるresolveおよびreject functionsは、関連付けられたpromiseを実際にresolveおよびrejectするcapabilityを持つ。Subclassesは、resolveおよびrejectにcustomized valuesを渡す異なるconstructor behaviourを持ってもよい。

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

Promise constructorは:

  • valueが%Function.prototype%である[[Prototype]] internal slotを持つ。
  • 以下のpropertiesを持つ:

27.5.4.1 Promise.all ( iterable )

このfunctionは、渡されたpromisesのfulfillment valuesのarrayでfulfilledされる、または最初にrejectする渡されたpromiseのreasonでrejectされるnew promiseを返す。このalgorithmを実行する際、渡されたiterableのすべてのelementsをpromisesにresolveする。

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

このfunctionは、そのthis valueがPromise constructorのparameter conventionsをsupportするconstructor functionであることをrequireする。

27.5.4.1.1 GetPromiseResolve ( promiseCtor )

The abstract operation GetPromiseResolve takes argument promiseCtor (a constructor) and returns either a normal completion containing a function object or a throw completion. It performs the following steps when called:

  1. promiseResolveを ? Get(promiseCtor, "resolve") とする。
  2. IsCallable(promiseResolve)がfalseなら、TypeError例外をthrowする。
  3. promiseResolveを返す。

27.5.4.1.2 PerformPromiseAll ( iteratorRecord, ctor, resultCapability, promiseResolve )

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

  1. valuesをnew empty Listとする。
  2. NOTE: remainingElementsCountは、input iteratorがexhaustedされる前に渡されたcallbackをcallするmisbehaving "then"が存在する場合でも、resultCapability.[[Resolve]]が一度だけcallされることをensureするため、0ではなく1から始まる。
  3. remainingElementsCountRecord { [[Value]]: 1 }とする。
  4. indexを0とする。
  5. 繰り返す:
    1. nextを ? IteratorStepValue(iteratorRecord) とする。
    2. nextdoneなら、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1に設定する。
      2. remainingElementsCount.[[Value]] = 0なら、
        1. valuesArrayCreateArrayFromList(values)とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray »)を実行する。
      3. resultCapability.[[Promise]]を返す。
    3. undefinedvaluesにappendする。
    4. nextPromiseを ? Call(promiseResolve, ctor, « next ») とする。
    5. fulfilledStepsを、parameters (value)を持ち、valuesresultCapability、およびremainingElementsCountをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
      1. activeFuncactive function objectとする。
      2. activeFunc.[[AlreadyCalled]]trueなら、undefinedを返す。
      3. activeFunc.[[AlreadyCalled]]trueに設定する。
      4. thisIndexactiveFunc.[[Index]]とする。
      5. values[thisIndex]をvalueに設定する。
      6. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1に設定する。
      7. remainingElementsCount.[[Value]] = 0なら、
        1. valuesArrayCreateArrayFromList(values)とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray »)を返す。
      8. undefinedを返す。
    6. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)とする。
    7. onFulfilled.[[AlreadyCalled]]falseに設定する。
    8. onFulfilled.[[Index]]indexに設定する。
    9. indexindex + 1に設定する。
    10. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1に設定する。
    11. Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] »)を実行する。

27.5.4.2 Promise.allSettled ( iterable )

このfunctionは、original promisesがすべてsettled、すなわちfulfilledまたはrejectedのいずれかになるまで待ってから、promise state snapshotsのarrayでfulfilledされるpromiseを返す。このalgorithmを実行する際、渡されたiterableのすべてのelementsをpromisesにresolveする。

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

このfunctionは、そのthis valueがPromise constructorのparameter conventionsをsupportするconstructor functionであることをrequireする。

27.5.4.2.1 PerformPromiseAllSettled ( iteratorRecord, ctor, resultCapability, promiseResolve )

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

  1. valuesをnew empty Listとする。
  2. NOTE: remainingElementsCountは、input iteratorがexhaustedされる前に渡されたcallbacksの1つをcallするmisbehaving "then"が存在する場合でも、resultCapability.[[Resolve]]が一度だけcallされることをensureするため、0ではなく1から始まる。
  3. remainingElementsCountRecord { [[Value]]: 1 }とする。
  4. indexを0とする。
  5. 繰り返す:
    1. nextを ? IteratorStepValue(iteratorRecord) とする。
    2. nextdoneなら、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1に設定する。
      2. remainingElementsCount.[[Value]] = 0なら、
        1. valuesArrayCreateArrayFromList(values)とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray »)を実行する。
      3. resultCapability.[[Promise]]を返す。
    3. undefinedvaluesにappendする。
    4. nextPromiseを ? Call(promiseResolve, ctor, « next ») とする。
    5. alreadyCalledRecord { [[Value]]: false }とする。
    6. fulfilledStepsを、parameters (value)を持ち、valuesresultCapability、およびremainingElementsCountをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
      1. activeFuncactive function objectとする。
      2. activeFunc.[[AlreadyCalled]].[[Value]]trueなら、undefinedを返す。
      3. activeFunc.[[AlreadyCalled]].[[Value]]trueに設定する。
      4. objOrdinaryObjectCreate(%Object.prototype%)とする。
      5. CreateDataPropertyOrThrow(obj, "status", "fulfilled")を実行する。
      6. CreateDataPropertyOrThrow(obj, "value", value)を実行する。
      7. thisIndexactiveFunc.[[Index]]とする。
      8. values[thisIndex]をobjに設定する。
      9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1に設定する。
      10. remainingElementsCount.[[Value]] = 0なら、
        1. valuesArrayCreateArrayFromList(values)とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray »)を返す。
      11. undefinedを返す。
    7. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)とする。
    8. onFulfilled.[[AlreadyCalled]]alreadyCalledに設定する。
    9. onFulfilled.[[Index]]indexに設定する。
    10. rejectedStepsを、parameters (error)を持ち、valuesresultCapability、およびremainingElementsCountをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
      1. activeFuncactive function objectとする。
      2. activeFunc.[[AlreadyCalled]].[[Value]]trueなら、undefinedを返す。
      3. activeFunc.[[AlreadyCalled]].[[Value]]trueに設定する。
      4. objOrdinaryObjectCreate(%Object.prototype%)とする。
      5. CreateDataPropertyOrThrow(obj, "status", "rejected")を実行する。
      6. CreateDataPropertyOrThrow(obj, "reason", error)を実行する。
      7. thisIndexactiveFunc.[[Index]]とする。
      8. values[thisIndex]をobjに設定する。
      9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1に設定する。
      10. remainingElementsCount.[[Value]] = 0なら、
        1. valuesArrayCreateArrayFromList(values)とする。
        2. Call(resultCapability.[[Resolve]], undefined, « valuesArray »)を返す。
      11. undefinedを返す。
    11. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)とする。
    12. onRejected.[[AlreadyCalled]]alreadyCalledに設定する。
    13. onRejected.[[Index]]indexに設定する。
    14. indexindex + 1に設定する。
    15. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1に設定する。
    16. Invoke(nextPromise, "then", « onFulfilled, onRejected »)を実行する。

27.5.4.3 Promise.any ( iterable )

このfunctionは、与えられたpromisesのうち最初にfulfilledされたpromiseによってfulfilledされるpromise、または与えられたpromisesがすべてrejectedされた場合にrejection reasonsを保持するAggregateErrorでrejectedされるpromiseを返す。このalgorithmを実行する際、渡されたiterableのすべてのelementsをpromisesにresolveする。

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

このfunctionは、そのthis valueがPromise constructorのparameter conventionsをsupportするconstructor functionであることをrequireする。

27.5.4.3.1 PerformPromiseAny ( iteratorRecord, ctor, resultCapability, promiseResolve )

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

  1. errorsをnew empty Listとする。
  2. NOTE: remainingElementsCountは、input iteratorがexhaustedされる前に渡されたcallbackをcallするmisbehaving "then"が存在する場合でも、resultCapability.[[Reject]]が一度だけcallされることをensureするため、0ではなく1から始まる。
  3. remainingElementsCountRecord { [[Value]]: 1 }とする。
  4. indexを0とする。
  5. 繰り返す:
    1. nextを ? IteratorStepValue(iteratorRecord) とする。
    2. nextdoneなら、
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1に設定する。
      2. remainingElementsCount.[[Value]] = 0なら、
        1. aggregateErrorをnewly created AggregateError objectとする。
        2. DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) })を実行する。
        3. Call(resultCapability.[[Reject]], undefined, « aggregateError »)を実行する。
      3. resultCapability.[[Promise]]を返す。
    3. undefinederrorsにappendする。
    4. nextPromiseを ? Call(promiseResolve, ctor, « next ») とする。
    5. rejectedStepsを、parameters (error)を持ち、errorsresultCapability、およびremainingElementsCountをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
      1. activeFuncactive function objectとする。
      2. activeFunc.[[AlreadyCalled]]trueなら、undefinedを返す。
      3. activeFunc.[[AlreadyCalled]]trueに設定する。
      4. thisIndexactiveFunc.[[Index]]とする。
      5. errors[thisIndex]をerrorに設定する。
      6. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1に設定する。
      7. remainingElementsCount.[[Value]] = 0なら、
        1. aggregateErrorをnewly created AggregateError objectとする。
        2. DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) })を実行する。
        3. Call(resultCapability.[[Reject]], undefined, « aggregateError »)を返す。
      8. undefinedを返す。
    6. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)とする。
    7. onRejected.[[AlreadyCalled]]falseに設定する。
    8. onRejected.[[Index]]indexに設定する。
    9. indexindex + 1に設定する。
    10. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1に設定する。
    11. Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected »)を実行する。

27.5.4.4 Promise.prototype

Promise.prototypeのinitial valueはPromise prototype objectである。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

27.5.4.5 Promise.race ( iterable )

このfunctionは、最初にsettleする渡されたpromiseと同じ方法でsettledされるnew promiseを返す。このalgorithmを実行する際、渡されたiterableのすべてのelementsをpromisesにresolveする。

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

iterable argumentがvaluesをyieldしない場合、またはiterableによってyieldされたpromisesのどれもsettleしない場合、このmethodによって返されるpending promiseは決してsettledされない。

Note 2

このfunctionは、そのthis valueがPromise constructorのparameter conventionsをsupportするconstructor functionであることをexpectedする。また、そのthis valueがresolve methodをprovideすることもexpectedする。

27.5.4.5.1 PerformPromiseRace ( iteratorRecord, ctor, resultCapability, promiseResolve )

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

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

27.5.4.6 Promise.reject ( reason )

このfunctionは、渡されたargumentでrejectedされたnew promiseを返す。

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

このfunctionは、そのthis valueがPromise constructorのparameter conventionsをsupportするconstructor functionであることをexpectedする。

27.5.4.7 Promise.resolve ( resolution )

このfunctionは、渡されたargumentでresolvedされたnew promise、またはargumentがこのconstructorによって生成されたpromiseである場合はargument自体を返す。

  1. ctorthis valueとする。
  2. ctorがObjectでないなら、TypeError例外をthrowする。
  3. PromiseResolve(ctor, resolution)を返す。
Note

このfunctionは、そのthis valueがPromise constructorのparameter conventionsをsupportするconstructor functionであることをexpectedする。

27.5.4.7.1 PromiseResolve ( ctor, resolution )

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

  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 )

このfunctionは、呼び出されたときに以下のstepsを実行する:

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

このfunctionは、そのthis valueがPromise constructorのparameter conventionsをsupportするconstructor functionであることをexpectedする。

27.5.4.9 Promise.withResolvers ( )

このfunctionは、new promiseと、それに関連付けられたresolveおよびreject functionsからなる3つのpropertiesを持つobjectを返す。

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

27.5.4.10 get Promise [ %Symbol.species% ]

Promise[%Symbol.species%]は、set accessor functionがundefinedであるaccessor propertyである。そのget accessor functionは、呼び出されたときに以下のstepsを実行する:

  1. this valueを返す。

このfunctionの"name" propertyのvalueは"get [Symbol.species]"である。

Note

Promise prototype methodsは通常、derived objectをcreateするために、そのthis valueのconstructorを使用する。しかし、subclass constructorは、その%Symbol.species% propertyをredefiningすることによって、そのdefault behaviourをover-rideしてもよい。

27.5.5 Promise Prototype Objectのプロパティ

Promise prototype objectは:

  • %Promise.prototype%である。
  • valueが%Object.prototype%である[[Prototype]] internal slotを持つ。
  • ordinary objectである。
  • [[PromiseState]] internal slot、またはPromise instancesの他のinternal slotsを持たない。

27.5.5.1 Promise.prototype.catch ( onRejected )

このmethodは、呼び出されたときに以下のstepsを実行する:

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

27.5.5.2 Promise.prototype.constructor

Promise.prototype.constructorのinitial valueは%Promise%である。

27.5.5.3 Promise.prototype.finally ( onFinally )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. promisethis valueとする。
  2. promiseがObjectでないなら、TypeError例外をthrowする。
  3. ctorを ? SpeciesConstructor(promise, %Promise%) とする。
  4. Assert: IsConstructor(ctor)はtrueである。
  5. IsCallable(onFinally)がfalseなら、
    1. thenFinallyonFinallyとする。
    2. catchFinallyonFinallyとする。
  6. そうでなければ、
    1. thenFinallyClosureを、parameters (value)を持ち、onFinallyおよびctorをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
      1. resultを ? Call(onFinally, undefined) とする。
      2. pを ? PromiseResolve(ctor, result) とする。
      3. returnValueを、parametersを持たず、valueをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
        1. NormalCompletion(value)を返す。
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « »)とする。
      5. Invoke(p, "then", « valueThunk »)を返す。
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « »)とする。
    3. catchFinallyClosureを、parameters (reason)を持ち、onFinallyおよびctorをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
      1. resultを ? Call(onFinally, undefined) とする。
      2. pを ? PromiseResolve(ctor, result) とする。
      3. throwReasonを、parametersを持たず、reasonをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
        1. reasonをThrowする。
      4. throwerCreateBuiltinFunction(throwReason, 0, "", « »)とする。
      5. Invoke(p, "then", « thrower »)を返す。
    4. catchFinallyCreateBuiltinFunction(catchFinallyClosure, 1, "", « »)とする。
  7. Invoke(promise, "then", « thenFinally, catchFinally »)を返す。

27.5.5.4 Promise.prototype.then ( onFulfilled, onRejected )

このmethodは、呼び出されたときに以下のstepsを実行する:

  1. promisethis valueとする。
  2. IsPromise(promise)がfalseなら、TypeError例外をthrowする。
  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 ] )

The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record) and returns an Object or undefined. これは、promise上でonFulfilledおよびonRejectedをsettlement actionsとして使用して“then” operationを実行する。resultCapabilityが渡された場合、resultはresultCapabilityのpromiseを更新することによって格納される。渡されない場合、PerformPromiseThenはresultが重要でないspecification-internal operationによってcallされている。 It performs the following steps when called:

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

27.5.5.5 Promise.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "Promise"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

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

Promise instancesは、Promise prototype object(intrinsic、%Promise.prototype%)からpropertiesをinheritするordinary objectsである。Promise instancesは、最初にTable 93に記述されるinternal slotsで作成される。

Table 93: Internal Slots of Promise Instances
Internal Slot Type Description
[[PromiseState]] pending, fulfilled, or rejected promiseがそのthen methodへのincoming callsにどのようにreactするかをgovernする。
[[PromiseResult]] ECMAScript language valueまたはempty promiseがfulfilledまたはrejectedされたvalue(ある場合)。[[PromiseState]]pendingである場合かつその場合に限りemptyである。
[[PromiseFulfillReactions]] PromiseReaction RecordsList promiseがpending stateからfulfilled stateにtransitionするとき/する場合にprocessedされるRecords
[[PromiseRejectReactions]] PromiseReaction RecordsList promiseがpending stateからrejected stateにtransitionするとき/する場合にprocessedされるRecords
[[PromiseIsHandled]] Boolean promiseがこれまでにfulfillmentまたはrejection handlerを持ったことがあるかどうかを示す。unhandled rejection trackingで使用される。

27.6 GeneratorFunctionオブジェクト

GeneratorFunctionsは、通常、GeneratorDeclarationGeneratorExpression、およびGeneratorMethodを評価することによって作成されるfunctionsである。これらは%GeneratorFunction% intrinsicをcallすることによって作成されることもある。

Figure 6 (Informative): Generatorオブジェクトの関係
非常に多様なboxesとarrows。

27.6.1 GeneratorFunctionコンストラクタ

GeneratorFunction constructorは:

  • %GeneratorFunction%である。
  • Functionのsubclassである。
  • constructorとしてではなくfunctionとして呼び出されたときにnew GeneratorFunctionをcreateしてinitializeする。したがって、function call GeneratorFunction (…)は、同じargumentsを持つobject creation expression new GeneratorFunction (…)と等価である。
  • class definitionのextends clauseのvalueとして使用してもよい。指定されたGeneratorFunction behaviourをinheritすることを意図するsubclass constructorsは、built-in GeneratorFunction behaviourに必要なinternal slotsでsubclass instancesをcreateしてinitializeするために、GeneratorFunction constructorへのsuper callを含まなければならない。generator function objectsをdefineするすべてのECMAScript syntactic formsは、GeneratorFunctionのdirect instancesを作成する。GeneratorFunction subclassesのinstancesを作成するsyntactic meansは存在しない。

27.6.1.1 GeneratorFunction ( ...paramArgs, bodyArg )

最後のargument(ある場合)は、generator functionのbody(executable code)を指定する。それより前のargumentsはformal parametersを指定する。

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. activeFuncactive function objectとする。
  2. bodyArgが存在しないなら、bodyArgをempty Stringに設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, generator, paramArgs, bodyArg)を返す。
Note

20.2.1.1NOTEを参照。

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

GeneratorFunction constructorは:

  • Function constructorからinheritするstandard built-in function objectである。
  • valueが%Function%である[[Prototype]] internal slotを持つ。
  • valueが1𝔽である"length" propertyを持つ。
  • valueが"GeneratorFunction"である"name" propertyを持つ。
  • 以下のpropertiesを持つ:

27.6.2.1 GeneratorFunction.prototype

GeneratorFunction.prototypeのinitial valueはGeneratorFunction prototype objectである。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

27.6.3 GeneratorFunction Prototype Objectのプロパティ

GeneratorFunction prototype objectは:

27.6.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructorのinitial valueは%GeneratorFunction%である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.6.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototypeのinitial valueは%GeneratorPrototype%である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.6.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "GeneratorFunction"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.6.4 GeneratorFunctionインスタンス

すべてのGeneratorFunction instanceはECMAScript function objectであり、Table 26に列挙されるinternal slotsを持つ。そのようなすべてのinstancesにおける[[IsClassConstructor]] internal slotのvalueはfalseである。

各GeneratorFunction instanceは以下のown propertiesを持つ:

27.6.4.1 length

20.2.4.1で与えられるFunction instancesの"length" propertyの仕様は、GeneratorFunction instancesにも適用される。

27.6.4.2 name

20.2.4.2で与えられるFunction instancesの"name" propertyの仕様は、GeneratorFunction instancesにも適用される。

27.6.4.3 prototype

GeneratorFunction instanceが作成されるたびに、別のordinary objectも作成され、generator functionの"prototype" propertyのinitial valueになる。prototype propertyのvalueは、generator function object[[Call]]を使用してinvokedされたときに、新たに作成されるGeneratorの[[Prototype]] internal slotをinitializeするために使用される。

このpropertyはattributes { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

Note

Function instancesとは異なり、GeneratorFunctionの"prototype" propertyのvalueであるobjectは、valueがGeneratorFunction instanceである"constructor" propertyを持たない。

27.7 AsyncGeneratorFunctionオブジェクト

AsyncGeneratorFunctionsは、通常、AsyncGeneratorDeclarationAsyncGeneratorExpression、およびAsyncGeneratorMethod syntactic productionsを評価することによって作成されるfunctionsである。これらは%AsyncGeneratorFunction% intrinsicをcallすることによって作成されることもある。

27.7.1 AsyncGeneratorFunctionコンストラクタ

AsyncGeneratorFunction constructorは:

  • %AsyncGeneratorFunction%である。
  • Functionのsubclassである。
  • constructorとしてではなくfunctionとして呼び出されたときにnew AsyncGeneratorFunctionをcreateしてinitializeする。したがって、function call AsyncGeneratorFunction (...)は、同じargumentsを持つobject creation expression new AsyncGeneratorFunction (...)と等価である。
  • class definitionのextends clauseのvalueとして使用してもよい。指定されたAsyncGeneratorFunction behaviourをinheritすることを意図するsubclass constructorsは、built-in AsyncGeneratorFunction behaviourに必要なinternal slotsでsubclass instancesをcreateしてinitializeするために、AsyncGeneratorFunction constructorへのsuper callを含まなければならない。async generator function objectsをdefineするすべてのECMAScript syntactic formsは、AsyncGeneratorFunctionのdirect instancesを作成する。AsyncGeneratorFunction subclassesのinstancesを作成するsyntactic meansは存在しない。

27.7.1.1 AsyncGeneratorFunction ( ...paramArgs, bodyArg )

最後のargument(ある場合)は、async generator functionのbody(executable code)を指定する。それより前のargumentsはformal parametersを指定する。

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. activeFuncactive function objectとする。
  2. bodyArgが存在しないなら、bodyArgをempty Stringに設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, async-generator, paramArgs, bodyArg)を返す。
Note

20.2.1.1NOTEを参照。

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

AsyncGeneratorFunction constructorは:

  • Function constructorからinheritするstandard built-in function objectである。
  • valueが%Function%である[[Prototype]] internal slotを持つ。
  • valueが1𝔽である"length" propertyを持つ。
  • valueが"AsyncGeneratorFunction"である"name" propertyを持つ。
  • 以下のpropertiesを持つ:

27.7.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototypeのinitial valueはAsyncGeneratorFunction prototype objectである。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

27.7.3 AsyncGeneratorFunction Prototype Objectのプロパティ

AsyncGeneratorFunction prototype objectは:

27.7.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructorのinitial valueは%AsyncGeneratorFunction%である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.7.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototypeのinitial valueは%AsyncGeneratorPrototype%である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.7.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "AsyncGeneratorFunction"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.7.4 AsyncGeneratorFunctionインスタンス

すべてのAsyncGeneratorFunction instanceはECMAScript function objectであり、Table 26に列挙されるinternal slotsを持つ。そのようなすべてのinstancesにおける[[IsClassConstructor]] internal slotのvalueはfalseである。

各AsyncGeneratorFunction instanceは以下のown propertiesを持つ:

27.7.4.1 length

"length" propertyのvalueは、AsyncGeneratorFunctionが通常expectedするargumentsの数を示すintegral Numberである。ただし、このlanguageは、そのfunctionがそれ以外の数のargumentsでinvokedされることをpermitする。"length" propertyによってspecifiedされる数以外の数のargumentsでinvokedされたときのAsyncGeneratorFunctionのbehaviourは、そのfunctionに依存する。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.7.4.2 name

20.2.4.2で与えられるFunction instancesの"name" propertyの仕様は、AsyncGeneratorFunction instancesにも適用される。

27.7.4.3 prototype

AsyncGeneratorFunction instanceが作成されるたびに、別のordinary objectも作成され、async generator functionの"prototype" propertyのinitial valueになる。prototype propertyのvalueは、generator function object[[Call]]を使用してinvokedされたときに、新たに作成されるAsyncGeneratorの[[Prototype]] internal slotをinitializeするために使用される。

このpropertyはattributes { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

Note

function instancesとは異なり、AsyncGeneratorFunctionの"prototype" propertyのvalueであるobjectは、valueがAsyncGeneratorFunction instanceである"constructor" propertyを持たない。

27.8 Generatorオブジェクト

Generatorは、generator functionをcallすることによって作成され、iterator interfaceiterable interfaceの両方にconformする。

Generator instancesは、そのinstanceを作成したgenerator functionの"prototype" propertyのinitial valueから直接propertiesをinheritする。Generator instancesは%GeneratorPrototype%から間接的にpropertiesをinheritする。

27.8.1 %GeneratorPrototype%オブジェクト

%GeneratorPrototype% objectは:

  • %GeneratorFunction.prototype.prototype%である。
  • ordinary objectである。
  • Generator instanceではなく、[[GeneratorState]] internal slotを持たない。
  • valueが%Iterator.prototype%である[[Prototype]] internal slotを持つ。
  • すべてのGenerator instancesによって間接的にinheritされるpropertiesを持つ。

27.8.1.1 %GeneratorPrototype%.constructor

%GeneratorPrototype%.constructorのinitial valueは%GeneratorFunction.prototype%である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.8.1.2 %GeneratorPrototype%.next ( value )

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

27.8.1.3 %GeneratorPrototype%.return ( value )

このmethodは、呼び出されたときに以下のstepsを実行する:

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

27.8.1.4 %GeneratorPrototype%.throw ( exception )

このmethodは、呼び出されたときに以下のstepsを実行する:

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

27.8.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "Generator"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

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

Generator instancesは、最初にTable 94に記述されるinternal slotsで作成される。

Table 94: Generatorインスタンスの内部スロット
Internal Slot Type Description
[[GeneratorState]] suspended-start, suspended-yield, executing, or completed generatorのcurrent execution state。
[[GeneratorContext]] execution context このgeneratorのcodeをexecutingするときに使用されるexecution context
[[GeneratorBrand]] Stringまたはempty 異なる種類のgeneratorsをdistinguishするために使用されるbrand。ECMAScript source textによってdeclaredされたgeneratorsの[[GeneratorBrand]]は常にemptyである。

27.8.3 Generator Abstract Operations

27.8.3.1 GeneratorStart ( gen, genBody )

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

  1. Assert: gen.[[GeneratorState]]suspended-startである。
  2. genContextrunning execution contextとする。
  3. genContextのGenerator componentをgenに設定する。
  4. closureを、parametersを持たず、genBodyをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. acGenContextrunning execution contextとする。
    2. acGenacGenContextのGenerator componentとする。
    3. genBodyParse Nodeなら、
      1. resultCompletion(Evaluation of genBody)とする。
    4. そうでなければ、
      1. Assert: genBodyはparametersを持たないAbstract Closureである。
      2. resultCompletion(genBody())とする。
    5. Assert: ここにreturnした場合、generatorはexceptionをthrowしたか、implicitまたはexplicit returnのいずれかを実行した。
    6. acGenContextexecution context stackからremoveし、execution context stackのtopにあるexecution contextrunning execution contextとしてrestoreする。
    7. acGen.[[GeneratorState]]completedに設定する。
    8. NOTE: generatorがcompleted stateに入ると、決してそこからleaveせず、そのassociated execution contextは決してresumedされない。この時点で、acGenにassociatedする任意のexecution stateはdiscardできる。
    9. resultnormal completionなら、
      1. resultValueundefinedとする。
    10. そうでなく、resultreturn completionなら、
      1. resultValueresult.[[Value]]とする。
    11. そうでなければ、
      1. Assert: resultthrow completionである。
      2. resultを返す。
    12. NormalCompletion(CreateIteratorResultObject(resultValue, true))を返す。
  5. genContextのcode evaluation stateを、そのexecution contextについてevaluationがresumedされたときに、closureがargumentsなしでcallされるように設定する。
  6. gen.[[GeneratorContext]]genContextに設定する。
  7. unusedを返す。

27.8.3.2 GeneratorValidate ( gen, genBrand )

The abstract operation GeneratorValidate takes arguments gen (an ECMAScript language value) and genBrand (a String or empty) and returns either a normal completion containing one of suspended-start, suspended-yield, or completed, or a throw completion. It performs the following steps when called:

  1. RequireInternalSlot(gen, [[GeneratorState]])を実行する。
  2. RequireInternalSlot(gen, [[GeneratorBrand]])を実行する。
  3. gen.[[GeneratorBrand]]genBrandでないなら、TypeError例外をthrowする。
  4. Assert: gen[[GeneratorContext]] internal slotを持つ。
  5. stategen.[[GeneratorState]]とする。
  6. stateexecutingなら、TypeError例外をthrowする。
  7. stateを返す。

27.8.3.3 GeneratorResume ( gen, value, genBrand )

The abstract operation GeneratorResume takes arguments gen (an ECMAScript language value), value (an ECMAScript language value or empty), and genBrand (a String or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

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

27.8.3.4 GeneratorResumeAbrupt ( gen, abruptCompletion, genBrand )

The abstract operation GeneratorResumeAbrupt takes arguments gen (an ECMAScript language value), abruptCompletion (a return completion or a throw completion), and genBrand (a String or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. stateを ? GeneratorValidate(gen, genBrand) とする。
  2. statesuspended-startなら、
    1. gen.[[GeneratorState]]completedに設定する。
    2. NOTE: generatorがcompleted stateに入ると、決してそこからleaveせず、そのassociated execution contextは決してresumedされない。この時点で、genにassociatedする任意のexecution stateはdiscardできる。
    3. statecompletedに設定する。
  3. statecompletedなら、
    1. abruptCompletionreturn completionなら、
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true)を返す。
    2. abruptCompletionを返す。
  4. Assert: statesuspended-yieldである。
  5. genContextgen.[[GeneratorContext]]とする。
  6. gen.[[GeneratorState]]executingに設定する。
  7. RunSuspendedContext(genContext, abruptCompletion)を返す。

27.8.3.5 GetGeneratorKind ( )

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

  1. genContextrunning execution contextとする。
  2. genContextがGenerator componentを持たないなら、non-generatorを返す。
  3. gengenContextのGenerator componentとする。
  4. gen[[AsyncGeneratorState]] internal slotを持つなら、asyncを返す。
  5. syncを返す。

27.8.3.6 GeneratorYield ( iteratorResult )

The abstract operation GeneratorYield takes argument iteratorResult (an Object that conforms to the IteratorResult interface) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. genContextを、実行中の実行コンテキストとする。
  2. Assert: genContextはジェネレータの実行コンテキストである。
  3. genを、genContextのGeneratorコンポーネントの値とする。
  4. Assert: GetGeneratorKind()はsyncである。
  5. gen.[[GeneratorState]]suspended-yieldに設定する。
  6. Return ? RunCallerContext(iteratorResult)。

27.8.3.7 Yield ( arg )

The abstract operation Yield takes argument arg (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. genKindGetGeneratorKind()とする。
  2. genKindasyncなら、? AsyncGeneratorYield(? Await(arg))を返す。
  3. GeneratorYield(CreateIteratorResultObject(arg, false))を返す。

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

The abstract operation CreateIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), genBrand (a String or empty), and genProto (an Object) and optional argument extraSlots (a List of names of internal slots) and returns a Generator. It performs the following steps when called:

  1. NOTE: closureは、IteratorResult objectをyieldするためにYield operationのusesを含むことができる。
  2. extraSlotsが存在しないなら、extraSlotsをnew empty Listに設定する。
  3. internalSlotsListextraSlotsと« [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] »のlist-concatenationとする。
  4. genOrdinaryObjectCreate(genProto, internalSlotsList)とする。
  5. gen.[[GeneratorBrand]]genBrandに設定する。
  6. gen.[[GeneratorState]]suspended-startに設定する。
  7. callerContextrunning execution contextとする。
  8. calleeContextをnew execution contextとする。
  9. calleeContextのFunctionをnullに設定する。
  10. calleeContextRealmcurrent Realm Recordに設定する。
  11. calleeContextのScriptOrModuleをcallerContextのScriptOrModuleに設定する。
  12. callerContextがまだsuspendedでないなら、callerContextをsuspendする。
  13. calleeContextexecution context stackにPushする。calleeContextはいまrunning execution contextである。
  14. GeneratorStart(gen, closure)を実行する。
  15. calleeContextexecution context stackからremoveし、callerContextrunning execution contextとしてrestoreする。
  16. genを返す。

27.9 AsyncGeneratorオブジェクト

AsyncGeneratorは、async generator functionをcallすることによって作成され、async iterator interfaceasync iterable interfaceの両方にconformする。

AsyncGenerator instancesは、そのinstanceを作成したasync generator functionの"prototype" propertyのinitial valueから直接propertiesをinheritする。AsyncGenerator instancesは%AsyncGeneratorPrototype%から間接的にpropertiesをinheritする。

27.9.1 %AsyncGeneratorPrototype%オブジェクト

%AsyncGeneratorPrototype% objectは:

  • %AsyncGeneratorFunction.prototype.prototype%である。
  • ordinary objectである。
  • AsyncGenerator instanceではなく、[[AsyncGeneratorState]] internal slotを持たない。
  • valueが%AsyncIteratorPrototype%である[[Prototype]] internal slotを持つ。
  • すべてのAsyncGenerator instancesによって間接的にinheritされるpropertiesを持つ。

27.9.1.1 %AsyncGeneratorPrototype%.constructor

%AsyncGeneratorPrototype%.constructorのinitial valueは%AsyncGeneratorFunction.prototype%である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.9.1.2 %AsyncGeneratorPrototype%.next ( value )

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

27.9.1.3 %AsyncGeneratorPrototype%.return ( value )

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

27.9.1.4 %AsyncGeneratorPrototype%.throw ( exception )

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

27.9.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "AsyncGenerator"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

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

AsyncGenerator instancesは、最初に以下に記述されるinternal slotsで作成される:

Table 95: AsyncGeneratorインスタンスの内部スロット
Internal Slot Type Description
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, or completed async generatorのcurrent execution state。
[[AsyncGeneratorContext]] execution context このasync generatorのcodeをexecutingするときに使用されるexecution context
[[AsyncGeneratorQueue]] AsyncGeneratorRequest RecordsList async generatorをresumeするrequestsを表すRecords。state transitionsの間を除き、[[AsyncGeneratorState]]executingまたはdraining-queueのいずれかである場合かつその場合に限りnon-emptyである。
[[GeneratorBrand]] Stringまたはempty 異なる種類のasync generatorsをdistinguishするために使用されるbrand。ECMAScript source textによってdeclaredされたasync generatorsの[[GeneratorBrand]]は常にemptyである。

27.9.3 AsyncGenerator Abstract Operations

27.9.3.1 AsyncGeneratorRequest Records

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

これらは以下のfieldsを持つ:

Table 96: AsyncGeneratorRequest Record Fields
Field Name Value Meaning
[[Completion]] Completion Record async generatorをresumeするために使用されるべきCompletion Record
[[Capability]] PromiseCapability Record このrequestにassociatedするpromise capabilities。

27.9.3.2 AsyncGeneratorStart ( gen, genBody )

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

  1. Assert: gen.[[AsyncGeneratorState]]suspended-startである。
  2. genContextrunning execution contextとする。
  3. genContextのGenerator componentをgenに設定する。
  4. closureを、parametersを持たず、genBodyをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. acGenContextrunning execution contextとする。
    2. acGenacGenContextのGenerator componentとする。
    3. genBodyParse Nodeなら、
      1. resultCompletion(Evaluation of genBody)とする。
    4. そうでなければ、
      1. Assert: genBodyはparametersを持たないAbstract Closureである。
      2. resultCompletion(genBody())とする。
    5. Assert: ここにreturnした場合、async generatorはexceptionをthrowしたか、implicitまたはexplicit returnのいずれかを実行した。
    6. acGenContextexecution context stackからremoveし、execution context stackのtopにあるexecution contextrunning execution contextとしてrestoreする。
    7. acGen.[[AsyncGeneratorState]]draining-queueに設定する。
    8. resultnormal completionなら、resultNormalCompletion(undefined)に設定する。
    9. resultreturn completionなら、resultNormalCompletion(result.[[Value]])に設定する。
    10. AsyncGeneratorCompleteStep(acGen, result, true)を実行する。
    11. AsyncGeneratorDrainQueue(acGen)を実行する。
    12. NormalCompletion(undefined)を返す。
  5. genContextのcode evaluation stateを、そのexecution contextについてevaluationがresumedされたときに、closureがargumentsなしでcallされるように設定する。
  6. gen.[[AsyncGeneratorContext]]genContextに設定する。
  7. gen.[[AsyncGeneratorQueue]]をnew empty Listに設定する。
  8. unusedを返す。

27.9.3.3 AsyncGeneratorValidate ( gen, genBrand )

The abstract operation AsyncGeneratorValidate takes arguments gen (an ECMAScript language value) and genBrand (a String or empty) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

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

27.9.3.4 AsyncGeneratorEnqueue ( gen, completion, promiseCapability )

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

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

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

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

  1. Assert: gen.[[AsyncGeneratorQueue]]はemptyでない。
  2. nextgen.[[AsyncGeneratorQueue]]のfirst elementとする。
  3. gen.[[AsyncGeneratorQueue]]からfirst elementをremoveする。
  4. promiseCapabilitynext.[[Capability]]とする。
  5. valuecompletion.[[Value]]とする。
  6. completionthrow completionなら、
    1. Call(promiseCapability.[[Reject]], undefined, « value »)を実行する。
  7. そうでなければ、
    1. Assert: completionnormal completionである。
    2. realmが存在するなら、
      1. oldRealmrunning execution contextRealmとする。
      2. running execution contextRealmrealmに設定する。
      3. iteratorResultCreateIteratorResultObject(value, done)とする。
      4. running execution contextRealmoldRealmに設定する。
    3. そうでなければ、
      1. iteratorResultCreateIteratorResultObject(value, done)とする。
    4. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)を実行する。
  8. unusedを返す。

27.9.3.6 AsyncGeneratorResume ( gen, completion )

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

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

27.9.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (a Completion Record) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

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

27.9.3.8 AsyncGeneratorYield ( arg )

The abstract operation AsyncGeneratorYield takes argument arg (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. genContextを、実行中の実行コンテキストとする。
  2. Assert: genContextはジェネレータの実行コンテキストである。
  3. genを、genContextのGeneratorコンポーネントの値とする。
  4. Assert: GetGeneratorKind()はasyncである。
  5. completionを、NormalCompletion(arg)とする。
  6. Assert: 実行コンテキストスタックには少なくとも2つの要素がある。
  7. previousContextを、実行コンテキストスタックの先頭から2番目の要素とする。
  8. previousRealmを、previousContextRealmとする。
  9. AsyncGeneratorCompleteStep(gen, completion, false, previousRealm)を実行する。
  10. queueを、gen.[[AsyncGeneratorQueue]]とする。
  11. queueが空でない場合、
    1. NOTE: 実行はジェネレータを中断せずに継続する。
    2. toYieldを、queueの最初の要素とする。
    3. resumptionValueを、Completion(toYield.[[Completion]])とする。
    4. Return ? AsyncGeneratorUnwrapYieldResumption(resumptionValue)。
  12. gen.[[AsyncGeneratorState]]suspended-yieldに設定する。
  13. resumptionValueを、Completion(RunCallerContext(undefined))とする。
  14. Return ? AsyncGeneratorUnwrapYieldResumption(resumptionValue)。

27.9.3.9 AsyncGeneratorAwaitReturn ( gen )

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

  1. Assert: gen.[[AsyncGeneratorState]]draining-queueである。
  2. queuegen.[[AsyncGeneratorQueue]]とする。
  3. Assert: queueはemptyでない。
  4. nextqueueのfirst elementとする。
  5. completionCompletion(next.[[Completion]])とする。
  6. Assert: completionreturn completionである。
  7. promiseCompletionCompletion(PromiseResolve(%Promise%, completion.[[Value]]))とする。
  8. promiseCompletionabrupt completionなら、
    1. AsyncGeneratorCompleteStep(gen, promiseCompletion, true)を実行する。
    2. AsyncGeneratorDrainQueue(gen)を実行する。
    3. unusedを返す。
  9. Assert: promiseCompletionnormal completionである。
  10. promisepromiseCompletion.[[Value]]とする。
  11. fulfilledClosureを、parameters (value)を持ち、genをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. Assert: gen.[[AsyncGeneratorState]]draining-queueである。
    2. resultNormalCompletion(value)とする。
    3. AsyncGeneratorCompleteStep(gen, result, true)を実行する。
    4. AsyncGeneratorDrainQueue(gen)を実行する。
    5. NormalCompletion(undefined)を返す。
  12. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « »)とする。
  13. rejectedClosureを、parameters (reason)を持ち、genをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. Assert: gen.[[AsyncGeneratorState]]draining-queueである。
    2. resultThrowCompletion(reason)とする。
    3. AsyncGeneratorCompleteStep(gen, result, true)を実行する。
    4. AsyncGeneratorDrainQueue(gen)を実行する。
    5. NormalCompletion(undefined)を返す。
  14. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « »)とする。
  15. PerformPromiseThen(promise, onFulfilled, onRejected)を実行する。
  16. unusedを返す。

27.9.3.10 AsyncGeneratorDrainQueue ( gen )

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

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

27.10 AsyncFunctionオブジェクト

AsyncFunctionsは、通常、AsyncFunctionDeclarationAsyncFunctionExpressionAsyncMethod、およびAsyncArrowFunctionを評価することによって作成されるfunctionsである。これらは%AsyncFunction% intrinsicをcallすることによって作成されることもある。

27.10.1 AsyncFunctionコンストラクタ

AsyncFunction constructorは:

  • %AsyncFunction%である。
  • Functionのsubclassである。
  • constructorとしてではなくfunctionとして呼び出されたときにnew AsyncFunctionをcreateしてinitializeする。したがって、function call AsyncFunction(…)は、同じargumentsを持つobject creation expression new AsyncFunction(…)と等価である。
  • class definitionのextends clauseのvalueとして使用してもよい。指定されたAsyncFunction behaviourをinheritすることを意図するsubclass constructorsは、built-in async function behaviourに必要なinternal slotsでsubclass instanceをcreateしてinitializeするために、AsyncFunction constructorへのsuper callを含まなければならない。async function objectsをdefineするすべてのECMAScript syntactic formsは、AsyncFunctionのdirect instancesを作成する。AsyncFunction subclassesのinstancesを作成するsyntactic meansは存在しない。

27.10.1.1 AsyncFunction ( ...paramArgs, bodyArg )

最後のargument(ある場合)は、async functionのbody(executable code)を指定する。それより前のargumentsはformal parametersを指定する。

このfunctionは、呼び出されたときに以下のstepsを実行する:

  1. activeFuncactive function objectとする。
  2. bodyArgが存在しないなら、bodyArgをempty Stringに設定する。
  3. CreateDynamicFunction(activeFunc, NewTarget, async, paramArgs, bodyArg)を返す。
Note
20.2.1.1NOTEを参照。

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

AsyncFunction constructorは:

  • Function constructorからinheritするstandard built-in function objectである。
  • valueが%Function%である[[Prototype]] internal slotを持つ。
  • valueが1𝔽である"length" propertyを持つ。
  • valueが"AsyncFunction"である"name" propertyを持つ。
  • 以下のpropertiesを持つ:

27.10.2.1 AsyncFunction.prototype

AsyncFunction.prototypeのinitial valueはAsyncFunction prototype objectである。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }を持つ。

27.10.3 AsyncFunction Prototype Objectのプロパティ

AsyncFunction prototype objectは:

27.10.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructorのinitial valueは%AsyncFunction%である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.10.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% propertyのinitial valueはString value "AsyncFunction"である。

このpropertyはattributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }を持つ。

27.10.4 AsyncFunctionインスタンス

すべてのAsyncFunction instanceはECMAScript function objectであり、Table 26に列挙されるinternal slotsを持つ。そのようなすべてのinstancesにおける[[IsClassConstructor]] internal slotのvalueはfalseである。AsyncFunction instancesはconstructorsではなく、[[Construct]] internal methodを持たない。AsyncFunction instancesはconstructableでないため、prototype propertyを持たない。

各AsyncFunction instanceは以下のown propertiesを持つ:

27.10.4.1 length

20.2.4.1で与えられるFunction instancesの"length" propertyの仕様は、AsyncFunction instancesにも適用される。

27.10.4.2 name

20.2.4.2で与えられるFunction instancesの"name" propertyの仕様は、AsyncFunction instancesにも適用される。

27.10.5 Async Functions Abstract Operations

27.10.5.1 AsyncFunctionStart ( promiseCapability, asyncFuncBody )

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

  1. runningContextrunning execution contextとする。
  2. asyncContextrunningContextのcopyとする。
  3. NOTE: execution stateのcopyingは、AsyncBlockStartがそのexecutionをresumeするためにrequiredである。現在executing中のcontextをresumeすることはill-definedである。
  4. AsyncBlockStart(promiseCapability, asyncFuncBody, asyncContext)を実行する。
  5. unusedを返す。

27.10.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

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

  1. closureを、parametersを持たず、promiseCapabilityおよびasyncBodyをcaptureし、呼び出されたときに以下のstepsを実行するnew Abstract Closureとする:
    1. acAsyncContextrunning execution contextとする。
    2. asyncBodyParse Nodeなら、
      1. resultCompletion(Evaluation of asyncBody)とする。
    3. そうでなければ、
      1. Assert: asyncBodyはparametersを持たないAbstract Closureである。
      2. resultCompletion(asyncBody())とする。
    4. Assert: ここにreturnした場合、async functionはexceptionをthrowしたか、implicitまたはexplicit returnを実行した。すべてのawaitingは完了している。
    5. acAsyncContextexecution context stackからremoveし、execution context stackのtopにあるexecution contextrunning execution contextとしてrestoreする。
    6. resultnormal completionなら、
      1. Call(promiseCapability.[[Resolve]], undefined, « undefined »)を実行する。
    7. そうでなく、resultreturn completionなら、
      1. Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] »)を実行する。
    8. そうでなければ、
      1. Assert: resultthrow completionである。
      2. Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] »)を実行する。
    9. NormalCompletion(unused)を返す。
  2. asyncContextのcode evaluation stateを、そのexecution contextについてevaluationがresumedされたときに、closureがargumentsなしでcallされるように設定する。
  3. resultを ! RunSuspendedContext(asyncContext, NormalCompletion(empty)) とする。
  4. Assert: resultunusedである。
  5. NOTE: result valuesのpossible sourcesは、Await、またはasync functionが何もawaitしない場合は上のstep 1.iである。
  6. unusedを返す。

27.10.5.3 Await ( arg )

The abstract operation Await takes argument arg (an ECMAScript language value) and returns either a normal completion containing either an ECMAScript language value or empty, or a throw completion. It performs the following steps when called:

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