27 控制抽象对象

27.1 迭代

27.1.1 通用迭代接口

接口是一组属性键,其关联值匹配特定规范。任何对象只要提供接口规范所描述的全部属性,就符合该接口。接口并不由一个独立对象表示。可以有许多分别实现的对象符合任意接口。单个对象可以符合多个接口。

27.1.1.1 Iterable 接口

iterable 接口包含 Table 79 中描述的属性:

Table 79: Iterable 接口必需属性
属性 要求
%Symbol.iterator% 返回 iterator 对象的函数 返回的对象必须符合 iterator 接口

27.1.1.2 Iterator 接口

实现 iterator 接口的对象必须包含 Table 80 中的属性。这类对象也可以实现 Table 81 中的属性。

Table 80: Iterator 接口必需属性
属性 要求
"next" 返回 IteratorResult 对象的函数 返回的对象必须符合 IteratorResult 接口。如果先前对某个 iteratornext 方法的调用已返回一个 "done" 属性为 true 的 IteratorResult 对象,则随后对该对象的 next 方法的所有调用也应返回一个 "done" 属性为 true 的 IteratorResult 对象。不过,此要求不会被强制执行。
Note 1

可以向 next 函数传递实参,但其解释和有效性取决于目标 iterator。for-of 语句和其他 iterator 的常见使用者不会传递任何实参,因此预期以这种方式使用的 iterator 对象必须准备好处理无实参调用的情况。

Table 81: Iterator 接口可选属性
属性 要求
"return" 返回 IteratorResult 对象的函数 返回的对象必须符合 IteratorResult 接口。调用此方法会通知 iterator 对象,调用者不打算再对该 iterator 进行任何 next 方法调用。返回的 IteratorResult 对象通常会有一个值为 true"done" 属性,以及一个 "value" 属性,其值为传给 return 方法的实参。不过,此要求不会被强制执行。
"throw" 返回 IteratorResult 对象的函数 返回的对象必须符合 IteratorResult 接口。调用此方法会通知 iterator 对象,调用者已检测到错误条件。该实参可用于标识错误条件,并且通常会是一个异常对象。典型响应是 throw 作为实参传入的值。如果该方法没有 throw,则返回的 IteratorResult 对象通常会有一个值为 true"done" 属性。
Note 2

通常,这些方法的调用者应在调用前检查其是否存在。某些 ECMAScript 语言特性,包括 for-ofyield* 和数组解构,会在执行存在性检查后调用这些方法。大多数接受 iterable 对象作为实参的 ECMAScript 库函数也会有条件地调用它们。

27.1.1.3 Async Iterable 接口

async iterable 接口包含 Table 82 中描述的属性:

Table 82: Async Iterable 接口必需属性
属性 要求
%Symbol.asyncIterator% 返回 async iterator 对象的函数 返回的对象必须符合 async iterator 接口

27.1.1.4 Async Iterator 接口

实现 async iterator 接口的对象必须包含 Table 83 中的属性。这类对象也可以实现 Table 84 中的属性。

Table 83: Async Iterator 接口必需属性
属性 要求
"next" 返回 IteratorResult 对象 promise 的函数

返回的 promise 在被兑现时,必须以符合 IteratorResult 接口的对象兑现。如果先前对某个 async iteratornext 方法的调用已返回一个其 "done" 属性为 true 的 IteratorResult 对象的 promise,则随后对该对象的 next 方法的所有调用也应返回一个其 "done" 属性为 true 的 IteratorResult 对象的 promise。不过,此要求不会被强制执行。

此外,作为兑现值的 IteratorResult 对象应具有一个 "value" 属性,其值不是 promise(也不是“thenable”)。不过,此要求也不会被强制执行。

Note 1

可以向 next 函数传递实参,但其解释和有效性取决于目标 async iterator。for-await-of 语句和其他 async iterator 的常见使用者不会传递任何实参,因此预期以这种方式使用的 async iterator 对象必须准备好处理无实参调用的情况。

Table 84: Async Iterator 接口可选属性
属性 要求
"return" 返回 IteratorResult 对象 promise 的函数

返回的 promise 在被兑现时,必须以符合 IteratorResult 接口的对象兑现。调用此方法会通知 async iterator 对象,调用者不打算再对该 async iterator 进行任何 next 方法调用。返回的 promise 会以一个 IteratorResult 对象兑现,该对象通常会有一个值为 true"done" 属性,以及一个 "value" 属性,其值为传给 return 方法的实参。不过,此要求不会被强制执行。

此外,作为兑现值的 IteratorResult 对象应具有一个 "value" 属性,其值不是 promise(也不是“thenable”)。如果实参值以典型方式使用,则如果它是一个被拒绝的 promise,应返回一个以相同理由拒绝的 promise;如果它是一个已兑现的 promise,则其兑现值应作为返回 promise 的 IteratorResult 对象兑现值的 "value" 属性。不过,这些要求也不会被强制执行。

"throw" 返回 IteratorResult 对象 promise 的函数

返回的 promise 在被兑现时,必须以符合 IteratorResult 接口的对象兑现。调用此方法会通知 async iterator 对象,调用者已检测到错误条件。该实参可用于标识错误条件,并且通常会是一个异常对象。典型响应是返回一个以传入实参值为拒绝理由的被拒绝 promise。

如果返回的 promise 被兑现,则 IteratorResult 对象兑现值通常会有一个值为 true"done" 属性。此外,它应具有一个 "value" 属性,其值不是 promise(也不是“thenable”),但此要求不会被强制执行。

Note 2

通常,这些方法的调用者应在调用前检查其是否存在。某些 ECMAScript 语言特性,包括 for-await-ofyield*,会在执行存在性检查后调用这些方法。

27.1.1.5 IteratorResult 接口

IteratorResult 接口包含 Table 85 中列出的属性:

Table 85: IteratorResult 接口属性
属性 要求
"done" Boolean 这是 iterator next 方法调用的结果状态。如果已到达 iterator 的末尾,则 "done"true。如果尚未到达末尾,则 "done"false,且有值可用。如果不存在 "done" 属性(无论是自有属性还是继承属性),则认为其值为 false
"value" ECMAScript 语言值 如果 done 是 false,则这是当前迭代元素值。如果 done 是 true,则这是 iterator 的返回值(如果它提供了返回值)。如果 iterator 没有返回值,则 "value"undefined。在这种情况下,如果符合该接口的对象没有继承显式的 "value" 属性,则 "value" 属性可以不存在。

27.1.2 Iterator Helper 对象

Iterator Helper 对象是一种普通对象,表示某个特定源 iterator 对象的惰性转换。Iterator Helper 对象没有命名构造器。相反,Iterator Helper 对象通过调用 Iterator 实例对象的某些方法来创建。

27.1.2.1 %IteratorHelperPrototype% 对象

%IteratorHelperPrototype% 对象:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

  1. 返回 ? GeneratorResume(this 值, undefined, "Iterator Helper")。

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. objthis 值。
  2. 执行 ? RequireInternalSlot(obj, [[UnderlyingIterators]])。
  3. 断言:obj 具有 [[GeneratorState]] 内部槽。
  4. 如果 obj.[[GeneratorState]]suspended-start,则
    1. obj.[[GeneratorState]] 设置为 completed
    2. 注:一旦 generator 进入 completed 状态,它就永远不会离开该状态,其关联执行上下文也永远不会恢复。此时可以丢弃与 obj 关联的任何执行状态。
    3. 执行 ? IteratorCloseAll(obj.[[UnderlyingIterators]], NormalCompletion(unused))。
    4. 返回 CreateIteratorResultObject(undefined, true)。
  5. completionReturnCompletion(undefined)。
  6. 返回 ? GeneratorResumeAbrupt(obj, completion, "Iterator Helper")。

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "Iterator Helper"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.1.3 Iterator 对象

27.1.3.1 Iterator 构造器

Iterator 构造器:

  • %Iterator%
  • 全局对象"Iterator" 属性的初始值。
  • 被设计为可子类化。它可以用作类定义的 extends 子句的值。

27.1.3.1.1 Iterator ( )

此函数在被调用时执行以下步骤:

  1. 如果 NewTarget 是 undefined活动函数对象,则抛出 TypeError 异常。
  2. 返回 ? OrdinaryCreateFromConstructor(NewTarget, "%Iterator.prototype%")。

27.1.3.2 Iterator 构造器的属性

Iterator 构造器:

27.1.3.2.1 Iterator.concat ( ...items )

  1. iterables 为新的空 List
  2. items 的每个元素 item,执行:
    1. 如果 item 不是 Object,则抛出 TypeError 异常。
    2. method 为 ? GetMethod(item, %Symbol.iterator%)。
    3. 如果 methodundefined,则抛出 TypeError 异常。
    4. Record { [[OpenMethod]]: method, [[Iterable]]: item } 追加到 iterables
  3. closure 为一个新的无参数 Abstract Closure,它捕获 iterables,并在被调用时执行以下步骤:
    1. iterables 的每个 Record iterable,执行:
      1. iterator 为 ? Call(iterable.[[OpenMethod]], iterable.[[Iterable]])。
      2. 如果 iterator 不是 Object,则抛出 TypeError 异常。
      3. iteratorRecord 为 ? GetIteratorDirect(iterator)。
      4. innerAlivetrue
      5. 重复,只要 innerAlivetrue
        1. innerValue 为 ? IteratorStepValue(iteratorRecord)。
        2. 如果 innerValuedone,则
          1. innerAlive 设置为 false
        3. 否则,
          1. completionCompletion(Yield(innerValue))。
          2. 如果 completion 是 abrupt completion,则
            1. 返回 ? IteratorClose(iteratorRecord, completion)。
    2. 返回 ReturnCompletion(undefined)。
  4. genCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)。
  5. gen.[[UnderlyingIterators]] 设置为新的空 List
  6. 返回 gen

27.1.3.2.2 Iterator.from ( obj )

  1. iteratorRecord 为 ? GetIteratorFlattenable(obj, iterate-string-primitives)。
  2. hasInstance 为 ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]])。
  3. 如果 hasInstancetrue,则
    1. 返回 iteratorRecord.[[Iterator]]
  4. wrapperOrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] »)。
  5. wrapper.[[Iterated]] 设置为 iteratorRecord
  6. 返回 wrapper

27.1.3.2.2.1 %WrapForValidIteratorPrototype% 对象

%WrapForValidIteratorPrototype% 对象:

27.1.3.2.2.1.1 %WrapForValidIteratorPrototype%.next ( )

  1. objthis 值。
  2. 执行 ? RequireInternalSlot(obj, [[Iterated]])。
  3. iteratorRecordobj.[[Iterated]]
  4. 返回 ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])。

27.1.3.2.2.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. objthis 值。
  2. 执行 ? RequireInternalSlot(obj, [[Iterated]])。
  3. iteratorobj.[[Iterated]].[[Iterator]]
  4. 断言:iterator 是 Object。
  5. returnMethod 为 ? GetMethod(iterator, "return")。
  6. 如果 returnMethodundefined,则
    1. 返回 CreateIteratorResultObject(undefined, true)。
  7. 返回 ? Call(returnMethod, iterator)。

27.1.3.2.3 Iterator.prototype

Iterator.prototype 的初始值是 Iterator 原型对象

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

27.1.3.2.4 Iterator.zip ( iterables [ , options ] )

此函数在被调用时执行以下步骤:

  1. 如果 iterables 不是 Object,则抛出 TypeError 异常。
  2. options 设置为 ? GetOptionsObject(options)。
  3. mode 为 ? Get(options, "mode")。
  4. 如果 modeundefined,则将 mode 设置为 "shortest"
  5. 如果 mode 不是 "shortest""longest""strict" 之一,则抛出 TypeError 异常。
  6. paddingOptionundefined
  7. 如果 mode"longest",则
    1. paddingOption 设置为 ? Get(options, "padding")。
    2. 如果 paddingOption 不是 undefinedpaddingOption 不是 Object,则抛出 TypeError 异常。
  8. iters 为新的空 List
  9. padding 为新的空 List
  10. inputIter 为 ? GetIterator(iterables, sync)。
  11. nextnot-started
  12. 重复,只要 next 不是 done
    1. next 设置为 Completion(IteratorStepValue(inputIter))。
    2. IfAbruptCloseIterators(next, iters)。
    3. 如果 next 不是 done,则
      1. iterCompletion(GetIteratorFlattenable(next, reject-primitives))。
      2. needClosing 为 « inputIter » 和 iters列表连接
      3. IfAbruptCloseIterators(iter, needClosing)。
      4. iter 追加到 iters
  13. iterCountiters 中元素的数量。
  14. 如果 mode"longest",则
    1. 如果 paddingOptionundefined,则
      1. 重复 iterCount 次:
        1. undefined 追加到 padding
    2. 否则,
      1. paddingIterCompletion(GetIterator(paddingOption, sync))。
      2. IfAbruptCloseIterators(paddingIter, iters)。
      3. usingIteratortrue
      4. 重复 iterCount 次:
        1. 如果 usingIteratortrue,则
          1. next 设置为 Completion(IteratorStepValue(paddingIter))。
          2. IfAbruptCloseIterators(next, iters)。
          3. 如果 nextdone,则
            1. usingIterator 设置为 false
          4. 否则,
            1. next 追加到 padding
        2. 如果 usingIteratorfalse,则将 undefined 追加到 padding
      5. 如果 usingIteratortrue,则
        1. completionCompletion(IteratorClose(paddingIter, NormalCompletion(unused)))。
        2. IfAbruptCloseIterators(completion, iters)。
  15. finishResults 为一个新的 Abstract Closure,其参数为 (results),不捕获任何内容,并在被调用时执行以下步骤:
    1. 返回 CreateArrayFromList(results)。
  16. 返回 IteratorZip(iters, mode, padding, finishResults)。

27.1.3.2.5 Iterator.zipKeyed ( iterables [ , options ] )

此函数在被调用时执行以下步骤:

  1. 如果 iterables 不是 Object,则抛出 TypeError 异常。
  2. options 设置为 ? GetOptionsObject(options)。
  3. mode 为 ? Get(options, "mode")。
  4. 如果 modeundefined,则将 mode 设置为 "shortest"
  5. 如果 mode 不是 "shortest""longest""strict" 之一,则抛出 TypeError 异常。
  6. paddingOptionundefined
  7. 如果 mode"longest",则
    1. paddingOption 设置为 ? Get(options, "padding")。
    2. 如果 paddingOption 不是 undefinedpaddingOption 不是 Object,则抛出 TypeError 异常。
  8. iters 为新的空 List
  9. padding 为新的空 List
  10. allKeys 为 ? iterables.[[OwnPropertyKeys]]()。
  11. keys 为新的空 List
  12. allKeys 的每个元素 key,执行:
    1. propertyDescCompletion(iterables.[[GetOwnProperty]](key))。
    2. IfAbruptCloseIterators(propertyDesc, iters)。
    3. 如果 propertyDesc 不是 undefinedpropertyDesc.[[Enumerable]]true,则
      1. valueCompletion(Get(iterables, key))。
      2. IfAbruptCloseIterators(value, iters)。
      3. 如果 value 不是 undefined,则
        1. key 追加到 keys
        2. iterCompletion(GetIteratorFlattenable(value, reject-primitives))。
        3. IfAbruptCloseIterators(iter, iters)。
        4. iter 追加到 iters
  13. iterCountiters 中元素的数量。
  14. 如果 mode"longest",则
    1. 如果 paddingOptionundefined,则
      1. 重复 iterCount 次:
        1. undefined 追加到 padding
    2. 否则,
      1. keys 的每个元素 key,执行:
        1. valueCompletion(Get(paddingOption, key))。
        2. IfAbruptCloseIterators(value, iters)。
        3. value 追加到 padding
  15. finishResults 为一个新的 Abstract Closure,其参数为 (results),捕获 keysiterCount,并在被调用时执行以下步骤:
    1. objOrdinaryObjectCreate(null)。
    2. 对满足 0 ≤ i < iterCount 的每个整数 i,按升序执行:
      1. 执行 ! CreateDataPropertyOrThrow(obj, keys[i], results[i])。
    3. 返回 obj
  16. 返回 IteratorZip(iters, mode, padding, finishResults)。

27.1.3.3 Iterator 原型对象的属性

Iterator 原型对象

Note

本规范中定义的所有实现 iterator 接口的对象也都继承自 %Iterator.prototype%。ECMAScript 代码也可以定义继承自 %Iterator.prototype% 的对象。%Iterator.prototype% 提供了一个位置,可在其中添加适用于所有 iterator 对象的其他方法。

以下表达式是 ECMAScript 代码访问 %Iterator.prototype% 对象的一种方式:

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

27.1.3.3.1 Iterator.prototype.constructor

Iterator.prototype.constructor访问器属性,其特性为 { [[Enumerable]]: false, [[Configurable]]: true }。[[Get]][[Set]] 特性定义如下:

27.1.3.3.1.1 get Iterator.prototype.constructor

[[Get]] 特性的值是一个不需要实参的内置函数。它在被调用时执行以下步骤:

  1. 返回 %Iterator%

27.1.3.3.1.2 set Iterator.prototype.constructor

[[Set]] 特性的值是一个接受实参 v 的内置函数。它在被调用时执行以下步骤:

  1. 执行 ? SetterThatIgnoresPrototypeProperties(this 值, %Iterator.prototype%, "constructor", v)。
  2. 返回 undefined
Note

不同于大多数内置原型上的 "constructor" 属性,出于 Web 兼容性原因,此属性必须是访问器。

27.1.3.3.2 Iterator.prototype.drop ( limit )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. numberLimitCompletion(ToNumber(limit))。
  5. IfAbruptCloseIterator(numberLimit, iterated)。
  6. 如果 numberLimitNaN,则
    1. errorThrowCompletion(一个新创建的 RangeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  7. intLimit 为 ! ToIntegerOrInfinity(numberLimit)。
  8. 如果 intLimit < 0,则
    1. errorThrowCompletion(一个新创建的 RangeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  9. iterated 设置为 ? GetIteratorDirect(obj)。
  10. closure 为一个新的无参数 Abstract Closure,它捕获 iteratedintLimit,并在被调用时执行以下步骤:
    1. remainingintLimit
    2. 重复,只要 remaining > 0,
      1. 如果 remaining ≠ +∞,则
        1. remaining 设置为 remaining - 1。
      2. next 为 ? IteratorStep(iterated)。
      3. 如果 nextdone,则返回 ReturnCompletion(undefined)。
    3. 重复,
      1. value 为 ? IteratorStepValue(iterated)。
      2. 如果 valuedone,则返回 ReturnCompletion(undefined)。
      3. completionCompletion(Yield(value))。
      4. IfAbruptCloseIterator(completion, iterated)。
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)。
  12. result.[[UnderlyingIterators]] 设置为 « iterated »。
  13. 返回 result

27.1.3.3.3 Iterator.prototype.every ( predicate )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. 如果 IsCallable(predicate) 是 false,则
    1. errorThrowCompletion(一个新创建的 TypeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  5. iterated 设置为 ? GetIteratorDirect(obj)。
  6. counter 为 0。
  7. 重复,
    1. value 为 ? IteratorStepValue(iterated)。
    2. 如果 valuedone,则返回 true
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))。
    4. IfAbruptCloseIterator(result, iterated)。
    5. 如果 ToBoolean(result) 是 false,则返回 ? IteratorClose(iterated, NormalCompletion(false))。
    6. counter 设置为 counter + 1。

27.1.3.3.4 Iterator.prototype.filter ( predicate )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. 如果 IsCallable(predicate) 是 false,则
    1. errorThrowCompletion(一个新创建的 TypeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  5. iterated 设置为 ? GetIteratorDirect(obj)。
  6. closure 为一个新的无参数 Abstract Closure,它捕获 iteratedpredicate,并在被调用时执行以下步骤:
    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. counter 设置为 counter + 1。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)。
  8. result.[[UnderlyingIterators]] 设置为 « iterated »。
  9. 返回 result

27.1.3.3.5 Iterator.prototype.find ( predicate )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. 如果 IsCallable(predicate) 是 false,则
    1. errorThrowCompletion(一个新创建的 TypeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  5. iterated 设置为 ? GetIteratorDirect(obj)。
  6. counter 为 0。
  7. 重复,
    1. value 为 ? IteratorStepValue(iterated)。
    2. 如果 valuedone,则返回 undefined
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))。
    4. IfAbruptCloseIterator(result, iterated)。
    5. 如果 ToBoolean(result) 是 true,则返回 ? IteratorClose(iterated, NormalCompletion(value))。
    6. counter 设置为 counter + 1。

27.1.3.3.6 Iterator.prototype.flatMap ( mapper )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. 如果 IsCallable(mapper) 是 false,则
    1. errorThrowCompletion(一个新创建的 TypeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  5. iterated 设置为 ? GetIteratorDirect(obj)。
  6. closure 为一个新的无参数 Abstract Closure,它捕获 iteratedmapper,并在被调用时执行以下步骤:
    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. innerAlive 设置为 false
        4. 否则,
          1. completionCompletion(Yield(innerValue))。
          2. 如果 completion 是 abrupt completion,则
            1. backupCompletionCompletion(IteratorClose(innerIterator, completion))。
            2. IfAbruptCloseIterator(backupCompletion, iterated)。
            3. 返回 ? IteratorClose(iterated, completion)。
      9. counter 设置为 counter + 1。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)。
  8. result.[[UnderlyingIterators]] 设置为 « iterated »。
  9. 返回 result

27.1.3.3.7 Iterator.prototype.forEach ( procedure )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. 如果 IsCallable(procedure) 是 false,则
    1. errorThrowCompletion(一个新创建的 TypeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  5. iterated 设置为 ? GetIteratorDirect(obj)。
  6. counter 为 0。
  7. 重复,
    1. value 为 ? IteratorStepValue(iterated)。
    2. 如果 valuedone,则返回 undefined
    3. resultCompletion(Call(procedure, undefined, « value, 𝔽(counter) »))。
    4. IfAbruptCloseIterator(result, iterated)。
    5. counter 设置为 counter + 1。

27.1.3.3.8 Iterator.prototype.map ( mapper )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. 如果 IsCallable(mapper) 是 false,则
    1. errorThrowCompletion(一个新创建的 TypeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  5. iterated 设置为 ? GetIteratorDirect(obj)。
  6. closure 为一个新的无参数 Abstract Closure,它捕获 iteratedmapper,并在被调用时执行以下步骤:
    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. counter 设置为 counter + 1。
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)。
  8. result.[[UnderlyingIterators]] 设置为 « iterated »。
  9. 返回 result

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

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. 如果 IsCallable(reducer) 是 false,则
    1. errorThrowCompletion(一个新创建的 TypeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  5. iterated 设置为 ? GetIteratorDirect(obj)。
  6. 如果 initialValue 不存在,则
    1. accumulator 为 ? IteratorStepValue(iterated)。
    2. 如果 accumulatordone,则抛出 TypeError 异常。
    3. counter 为 1。
  7. 否则,
    1. accumulatorinitialValue
    2. counter 为 0。
  8. 重复,
    1. value 为 ? IteratorStepValue(iterated)。
    2. 如果 valuedone,则返回 accumulator
    3. resultCompletion(Call(reducer, undefined, « accumulator, value, 𝔽(counter) »))。
    4. IfAbruptCloseIterator(result, iterated)。
    5. accumulator 设置为 result
    6. counter 设置为 counter + 1。

27.1.3.3.10 Iterator.prototype.some ( predicate )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. 如果 IsCallable(predicate) 是 false,则
    1. errorThrowCompletion(一个新创建的 TypeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  5. iterated 设置为 ? GetIteratorDirect(obj)。
  6. counter 为 0。
  7. 重复,
    1. value 为 ? IteratorStepValue(iterated)。
    2. 如果 valuedone,则返回 false
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))。
    4. IfAbruptCloseIterator(result, iterated)。
    5. 如果 ToBoolean(result) 是 true,则返回 ? IteratorClose(iterated, NormalCompletion(true))。
    6. counter 设置为 counter + 1。

27.1.3.3.11 Iterator.prototype.take ( limit )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iteratedIterator Record { [[Iterator]]: obj, [[NextMethod]]: undefined, [[Done]]: false }。
  4. numberLimitCompletion(ToNumber(limit))。
  5. IfAbruptCloseIterator(numberLimit, iterated)。
  6. 如果 numberLimitNaN,则
    1. errorThrowCompletion(一个新创建的 RangeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  7. intLimit 为 ! ToIntegerOrInfinity(numberLimit)。
  8. 如果 intLimit < 0,则
    1. errorThrowCompletion(一个新创建的 RangeError 对象)。
    2. 返回 ? IteratorClose(iterated, error)。
  9. iterated 设置为 ? GetIteratorDirect(obj)。
  10. closure 为一个新的无参数 Abstract Closure,它捕获 iteratedintLimit,并在被调用时执行以下步骤:
    1. remainingintLimit
    2. 重复,
      1. 如果 remaining = 0,则
        1. 返回 ? IteratorClose(iterated, ReturnCompletion(undefined))。
      2. 如果 remaining ≠ +∞,则
        1. remaining 设置为 remaining - 1。
      3. value 为 ? IteratorStepValue(iterated)。
      4. 如果 valuedone,则返回 ReturnCompletion(undefined)。
      5. completionCompletion(Yield(value))。
      6. IfAbruptCloseIterator(completion, iterated)。
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »)。
  12. result.[[UnderlyingIterators]] 设置为 « iterated »。
  13. 返回 result

27.1.3.3.12 Iterator.prototype.toArray ( )

此方法在被调用时执行以下步骤:

  1. objthis 值。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. iterated 为 ? GetIteratorDirect(obj)。
  4. items 为新的空 List
  5. 重复,
    1. value 为 ? IteratorStepValue(iterated)。
    2. 如果 valuedone,则返回 CreateArrayFromList(items)。
    3. value 追加到 items

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

调用此方法时,它执行以下步骤:

  1. objthis 值。
  2. return 为 ? GetMethod(obj, "return")。
  3. 如果 return 不是 undefined,则
    1. 执行 ? Call(return, obj)。
  4. 返回 undefined

此方法的 "name" 属性的值是 "[Symbol.dispose]"

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

此函数在被调用时执行以下步骤:

  1. 返回 this 值。

此函数的 "name" 属性的值是 "[Symbol.iterator]"

27.1.3.3.15 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%]访问器属性,其特性为 { [[Enumerable]]: false, [[Configurable]]: true }。[[Get]][[Set]] 特性定义如下:

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

[[Get]] 特性的值是一个不需要实参的内置函数。它在被调用时执行以下步骤:

  1. 返回 "Iterator"

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

[[Set]] 特性的值是一个接受实参 v 的内置函数。它在被调用时执行以下步骤:

  1. 执行 ? SetterThatIgnoresPrototypeProperties(this 值, %Iterator.prototype%, %Symbol.toStringTag%, v)。
  2. 返回 undefined
Note

不同于大多数内置原型上的 %Symbol.toStringTag% 属性,出于 Web 兼容性原因,此属性必须是访问器。

27.1.3.4 Iterator 的抽象操作

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 中元素的数量。
  2. openItersiters 的副本。
  3. closure 为一个新的无参数 Abstract Closure,它捕获 itersiterCountopenItersmodepaddingfinishResults,并在被调用时执行以下步骤:
    1. 如果 iterCount = 0,则返回 ReturnCompletion(undefined)。
    2. 重复,
      1. results 为新的空 List
      2. 断言:openIters 不是空。
      3. 对满足 0 ≤ i < iterCount 的每个整数 i,按升序执行:
        1. iteriters[i]。
        2. 如果 iternull,则
          1. 断言:mode"longest"
          2. resultpadding[i]。
        3. 否则,
          1. resultCompletion(IteratorStepValue(iter))。
          2. 如果 result 是 abrupt completion,则
            1. openIters 中移除 iter
            2. 返回 ? IteratorCloseAll(openIters, result)。
          3. result 设置为 ! result
          4. 如果 resultdone,则
            1. openIters 中移除 iter
            2. 如果 mode"shortest",则
              1. 返回 ? IteratorCloseAll(openIters, ReturnCompletion(undefined))。
            3. 否则,如果 mode"strict",则
              1. 如果 i ≠ 0,则
                1. 返回 ? IteratorCloseAll(openIters, ThrowCompletion(一个新创建的 TypeError 对象))。
              2. 对满足 1 ≤ k < iterCount 的每个整数 k,按升序执行:
                1. 断言:iters[k] 不是 null
                2. openCompletion(IteratorStep(iters[k]))。
                3. 如果 open 是 abrupt completion,则
                  1. openIters 中移除 iters[k]。
                  2. 返回 ? IteratorCloseAll(openIters, open)。
                4. open 设置为 ! open
                5. 如果 opendone,则
                  1. openIters 中移除 iters[k]。
                6. 否则,
                  1. 返回 ? IteratorCloseAll(openIters, ThrowCompletion(一个新创建的 TypeError 对象))。
              3. 返回 ReturnCompletion(undefined)。
            4. 否则,
              1. 断言:mode"longest"
              2. 如果 openIters 为空,则返回 ReturnCompletion(undefined)。
              3. iters[i] 设置为 null
              4. result 设置为 padding[i]。
        4. result 追加到 results
      4. results 设置为 finishResults(results)。
      5. 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% 对象:

Note

本规范中定义的所有实现 async iterator 接口的对象也都继承自 %AsyncIteratorPrototype%。ECMAScript 代码也可以定义继承自 %AsyncIteratorPrototype% 的对象。%AsyncIteratorPrototype% 对象提供了一个位置,可在其中添加适用于所有 async iterator 对象的其他方法。

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

调用此方法时,它执行以下步骤:

  1. objthis 值。
  2. promiseCapability 为 ! NewPromiseCapability(%Promise%)。
  3. returnCompletion(GetMethod(obj, "return"))。
  4. IfAbruptRejectPromise(return, promiseCapability)。
  5. 如果 returnundefined,则
    1. 执行 ! Call(promiseCapability.[[Resolve]], undefined, « undefined »)。
  6. 否则,
    1. resultCompletion(Call(return, obj, « »))。
    2. IfAbruptRejectPromise(result, promiseCapability)。
    3. resultWrapperCompletion(PromiseResolve(%Promise%, result))。
    4. IfAbruptRejectPromise(resultWrapper, promiseCapability)。
    5. unwrap 为一个新的抽象闭包,该闭包没有参数,不捕获任何内容,并在被调用时执行以下步骤:
      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% ] ( )

此函数在被调用时执行以下步骤:

  1. 返回 this 值。

此函数的 "name" 属性的值是 "[Symbol.asyncIterator]"

27.1.5 Async-from-Sync Iterator 对象

Async-from-Sync Iterator 对象是一种 async iterator,用于适配特定的同步 iterator。ECMAScript 代码永远无法直接访问 Async-from-Sync Iterator 对象。Async-from-Sync Iterator 对象没有命名构造器。相反,Async-from-Sync Iterator 对象根据需要由 CreateAsyncFromSyncIterator 抽象操作创建。

27.1.5.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (an Iterator Record) and returns an Iterator Record. 它用于从同步 Iterator Record 创建 async Iterator Record。 It performs the following steps when called:

  1. asyncIteratorOrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] »)。
  2. asyncIterator.[[SyncIteratorRecord]] 设置为 syncIteratorRecord
  3. nextMethod 为 ! Get(asyncIterator, "next")。
  4. iteratorRecordIterator Record { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false }。
  5. 返回 iteratorRecord

27.1.5.2 %AsyncFromSyncIteratorPrototype% 对象

%AsyncFromSyncIteratorPrototype% 对象:

27.1.5.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. objthis 值。
  2. 断言:obj 是具有 [[SyncIteratorRecord]] 内部槽的 Object。
  3. promiseCapability 为 ! NewPromiseCapability(%Promise%)。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]]
  5. 如果 value 存在,则
    1. resultCompletion(IteratorNext(syncIteratorRecord, value))。
  6. 否则,
    1. resultCompletion(IteratorNext(syncIteratorRecord))。
  7. IfAbruptRejectPromise(result, promiseCapability)。
  8. 返回 AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true)。

27.1.5.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. objthis 值。
  2. 断言:obj 是具有 [[SyncIteratorRecord]] 内部槽的 Object。
  3. promiseCapability 为 ! NewPromiseCapability(%Promise%)。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]]
  5. syncIteratorsyncIteratorRecord.[[Iterator]]
  6. returnCompletion(GetMethod(syncIterator, "return"))。
  7. IfAbruptRejectPromise(return, promiseCapability)。
  8. 如果 returnundefined,则
    1. iteratorResultCreateIteratorResultObject(value, true)。
    2. 执行 ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)。
    3. 返回 promiseCapability.[[Promise]]
  9. 如果 value 存在,则
    1. resultCompletion(Call(return, syncIterator, « value »))。
  10. 否则,
    1. resultCompletion(Call(return, syncIterator))。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. 如果 result 不是 Object,则
    1. 执行 ! Call(promiseCapability.[[Reject]], undefined, « 一个新创建的 TypeError 对象 »)。
    2. 返回 promiseCapability.[[Promise]]
  13. 返回 AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, false)。

27.1.5.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

Note
在本规范中,value 总是被提供,但为了与 %AsyncFromSyncIteratorPrototype%.return ( [ value ] ) 保持一致,仍将其保留为可选。
  1. objthis 值。
  2. 断言:obj 是具有 [[SyncIteratorRecord]] 内部槽的 Object。
  3. promiseCapability 为 ! NewPromiseCapability(%Promise%)。
  4. syncIteratorRecordobj.[[SyncIteratorRecord]]
  5. syncIteratorsyncIteratorRecord.[[Iterator]]
  6. throwCompletion(GetMethod(syncIterator, "throw"))。
  7. IfAbruptRejectPromise(throw, promiseCapability)。
  8. 如果 throwundefined,则
    1. 注:如果 syncIterator 没有 throw 方法,则关闭它,使其在我们拒绝 capability 之前有机会进行清理。
    2. closeCompletionNormalCompletion(empty)。
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion))。
    4. IfAbruptRejectPromise(result, promiseCapability)。
    5. 注:下一步抛出 TypeError,以指示存在协议违例:syncIterator 没有 throw 方法。
    6. 注:如果关闭 syncIterator 没有抛出异常,则该操作的结果会被忽略,即使它产生一个被拒绝的 promise。
    7. 执行 ! Call(promiseCapability.[[Reject]], undefined, « 一个新创建的 TypeError 对象 »)。
    8. 返回 promiseCapability.[[Promise]]
  9. 如果 value 存在,则
    1. resultCompletion(Call(throw, syncIterator, « value »))。
  10. 否则,
    1. resultCompletion(Call(throw, syncIterator))。
  11. IfAbruptRejectPromise(result, promiseCapability)。
  12. 如果 result 不是 Object,则
    1. 执行 ! Call(promiseCapability.[[Reject]], undefined, « 一个新创建的 TypeError 对象 »)。
    2. 返回 promiseCapability.[[Promise]]
  13. 返回 AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true)。

27.1.5.3 Async-from-Sync Iterator 实例的属性

Async-from-Sync Iterator 实例是普通对象,继承自 %AsyncFromSyncIteratorPrototype% 固有对象的属性。Async-from-Sync Iterator 实例最初创建时具有 Table 86 中列出的内部槽。

Table 86: Async-from-Sync Iterator 实例的内部槽
内部槽 类型 描述
[[SyncIteratorRecord]] Iterator Record 表示正在被适配的原始同步 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. 注:由于 promiseCapability 派生自固有 %Promise%,因此下面使用 IfAbruptRejectPromise 所导致的对 promiseCapability.[[Reject]] 的调用保证不会抛出。
  2. doneCompletion(IteratorComplete(result))。
  3. IfAbruptRejectPromise(done, promiseCapability)。
  4. valueCompletion(IteratorValue(result))。
  5. IfAbruptRejectPromise(value, promiseCapability)。
  6. valueWrapperCompletion(PromiseResolve(%Promise%, value))。
  7. 如果 valueWrapper 是 abrupt completion,donefalse,且 closeOnRejectiontrue,则
    1. valueWrapper 设置为 Completion(IteratorClose(syncIteratorRecord, valueWrapper))。
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability)。
  9. unwrap 为一个新的 Abstract Closure,其参数为 (v),捕获 done,并在被调用时执行以下步骤:
    1. 返回 CreateIteratorResultObject(v, done)。
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « »)。
  11. 注:onFulfilled 用于在处理 IteratorResult 对象的 "value" 属性时等待其值(如果它是 promise),并将结果重新包装到新的“已解包”IteratorResult 对象中。
  12. 如果 donetruecloseOnRejectionfalse,则
    1. onRejectedundefined
  13. 否则,
    1. closeIterator 为一个新的 Abstract Closure,其参数为 (error),捕获 syncIteratorRecord,并在被调用时执行以下步骤:
      1. 返回 ? IteratorClose(syncIteratorRecord, ThrowCompletion(error))。
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « »)。
    3. 注:当 IteratorResult 对象所产生的 "value" 属性是被拒绝的 promise 时,onRejected 用于关闭 Iterator
  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 对象:调用者不打算继续使用此对象。此方法应执行任何必要逻辑,以对资源执行显式清理,包括但不限于文件系统句柄、流、宿主对象等。当此方法抛出异常时,通常意味着无法显式释放该资源。

对同一个对象多次调用此方法时,应避免对已经处置的资源重复执行清理逻辑,并且不应抛出异常,即使第一次调用时曾抛出异常也是如此。不过,此要求不会被强制执行。

当通过 usingawait using 声明使用 Disposable 对象时,在直接包含该声明的 BlockModule 求值完成后,该资源将被自动处置。

27.2.1.2 AsyncDisposable 接口

AsyncDisposable 接口包含 Table 88 中描述的属性:

Table 88: AsyncDisposable 接口必需属性
属性 要求
%Symbol.asyncDispose% 一个返回 promise 的函数对象

调用此方法会通知 AsyncDisposable 对象:调用者不打算继续使用此对象。此方法应执行任何必要逻辑,以对资源执行显式清理,包括但不限于文件系统句柄、流、宿主对象等。当此方法返回的 promise 被拒绝时,通常意味着无法显式释放该资源。直到所得 Promise 被兑现前,AsyncDisposable 对象不被视为已“处置”。

对同一个对象多次调用此方法时,应避免对已经处置的资源重复执行清理逻辑,并且不应抛出异常或返回被拒绝的 promise,即使第一次调用时曾抛出异常或返回被拒绝的 promise 也是如此。不过,此要求不会被强制执行。

当通过 await using 声明使用 AsyncDisposable 对象时,在直接包含该声明的 BlockModule 求值完成后,该资源将被自动处置。

27.3 DisposableStack 对象

DisposableStack 是一个对象,可用于容纳一个或多个应一起处置的资源。

任何 DisposableStack 对象都处于两个互斥状态之一:已处置待处理。当且仅当既未对可处置栈 d 调用 d.dispose(),也未对其调用 d.move() 时,d 是待处理的。

27.3.1 DisposableStack 构造函数

DisposableStack 构造函数

  • %DisposableStack%
  • 全局对象"DisposableStack" 属性的初始值。
  • 在作为构造函数调用时,创建并初始化一个新的 DisposableStack。
  • 不旨在作为函数调用,并且在以这种方式调用时会抛出异常。
  • 可用作类定义的 extends 子句中的值。意图继承指定 DisposableStack 行为的子类构造函数,必须包含一次对 DisposableStack 构造函数super 调用,以创建并初始化带有必要内部状态的子类实例,从而支持 DisposableStack.prototype 的内置方法。

27.3.1.1 DisposableStack ( )

调用此函数时,它执行以下步骤:

  1. 如果 NewTarget 是 undefined,则抛出 TypeError 异常。
  2. disposableStack 为 ? OrdinaryCreateFromConstructor(NewTarget, "%DisposableStack.prototype%", « [[DisposableState]], [[DisposableResourceStack]] »)。
  3. disposableStack.[[DisposableState]] 设置为 pending
  4. disposableStack.[[DisposableResourceStack]] 设置为一个新的空列表。
  5. 返回 disposableStack

27.3.2 DisposableStack 构造函数的属性

DisposableStack 构造函数

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,并在被调用时执行以下步骤:
    1. 返回 ? 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. 返回 ? 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]] 设置为一个新的空列表。
  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% 属性的初始值是 %DisposableStack.prototype.dispose%,定义于 27.3.3.4

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]] pendingdisposed 支配可处置栈将如何响应对其 %Symbol.dispose% 方法的传入调用。
[[DisposableResourceStack]] 一个 DisposableResource 记录的列表 在可处置栈被处置时要处置的资源。资源按其初始化顺序添加,并按相反顺序处置。

27.4 AsyncDisposableStack 对象

AsyncDisposableStack 是一个对象,可用于容纳一个或多个应一起异步处置的资源。

任何 AsyncDisposableStack 对象都处于两个互斥状态之一:已处置待处理。当且仅当既未对异步可处置栈 d 调用 d.disposeAsync(),也未对其调用 d.move() 时,d 是待处理的。

27.4.1 AsyncDisposableStack 构造函数

AsyncDisposableStack 构造函数

  • %AsyncDisposableStack%
  • 全局对象"AsyncDisposableStack" 属性的初始值。
  • 在作为构造函数调用时,创建并初始化一个新的 AsyncDisposableStack。
  • 不旨在作为函数调用,并且在以这种方式调用时会抛出异常。
  • 可用作类定义的 extends 子句中的值。意图继承指定 AsyncDisposableStack 行为的子类构造函数,必须包含一次对 AsyncDisposableStack 构造函数super 调用,以创建并初始化带有必要内部状态的子类实例,从而支持 AsyncDisposableStack.prototype 的内置方法。

27.4.1.1 AsyncDisposableStack ( )

调用此函数时,它执行以下步骤:

  1. 如果 NewTarget 是 undefined,则抛出 TypeError 异常。
  2. asyncDisposableStack 为 ? OrdinaryCreateFromConstructor(NewTarget, "%AsyncDisposableStack.prototype%", « [[AsyncDisposableState]], [[DisposableResourceStack]] »)。
  3. asyncDisposableStack.[[AsyncDisposableState]] 设置为 pending
  4. asyncDisposableStack.[[DisposableResourceStack]] 设置为一个新的空列表。
  5. 返回 asyncDisposableStack

27.4.2 AsyncDisposableStack 构造函数的属性

AsyncDisposableStack 构造函数

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,并在被调用时执行以下步骤:
    1. 返回 ? 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. 返回 ? 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]] 设置为一个新的空列表。
  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% 属性的初始值是 %AsyncDisposableStack.prototype.disposeAsync%,定义于 27.4.3.4

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]] pendingdisposed 支配可处置栈将如何响应对其 %Symbol.asyncDispose% 方法的传入调用。
[[DisposableResourceStack]] 一个 DisposableResource 记录的列表 在可处置栈被处置时要处置的资源。资源按其初始化顺序添加,并按相反顺序处置。

27.5 Promise 对象

Promise 是一种对象,用作延迟(并且可能是异步的)计算最终结果的占位符。

任何 Promise 都处于三种互斥状态之一:已兑现已拒绝待定

  • 如果 p.then(f, r) 会立即入队一个 Job 来调用函数 f,则 promise p 已兑现。
  • 如果 p.then(f, r) 会立即入队一个 Job 来调用函数 r,则 promise p 已拒绝。
  • 如果 promise 既未兑现也未拒绝,则它是待定的。

如果 promise 不是待定的,即如果它已兑现或已拒绝,则称该 promise 已敲定

如果 promise 已敲定,或者它已被“锁定”为匹配另一个 promise 的状态,则该 promise 是已解决的。尝试解决或拒绝一个已解决的 promise 没有效果。如果 promise 不是已解决的,则它是未解决的。未解决的 promise 总是处于待定状态。已解决的 promise 可以是待定、已兑现或已拒绝。

27.5.1 Promise 抽象操作

27.5.1.1 PromiseCapability Record

PromiseCapability Record 是一种 Record 值,用于封装 Promise 或类 promise 对象,以及能够解决或拒绝该 promise 的函数。PromiseCapability Record 由 NewPromiseCapability 抽象操作产生。

PromiseCapability Record 具有 Table 91 中列出的字段。

Table 91: PromiseCapability Record 字段
字段名 含义
[[Promise]] Object 可用作 promise 的对象。
[[Resolve]] function object 用于解决给定 promise 的函数。
[[Reject]] function object 用于拒绝给定 promise 的函数。

27.5.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise 是一系列使用 PromiseCapability Record 的算法步骤的简写。形式如下的算法步骤:

  1. IfAbruptRejectPromise(value, capability)。

与以下内容含义相同:

  1. 断言:valueCompletion Record
  2. 如果 value 是 abrupt completion,则
    1. 执行 ? Call(capability.[[Reject]], undefined, « value.[[Value]] »)。
    2. 返回 capability.[[Promise]]
  3. value 设置为 ! value

27.5.1.2 PromiseReaction Record

PromiseReaction Record 是一种 Record 值,用于存储当 promise 以给定值变为已解决或已拒绝时应如何作出反应的信息。PromiseReaction Record 由 PerformPromiseThen 抽象操作创建,并由 NewPromiseReactionJob 返回的 Abstract Closure 使用。

PromiseReaction Record 具有 Table 92 中列出的字段。

Table 92: PromiseReaction Record 字段
字段名 含义
[[Capability]] PromiseCapability Recordundefined Record 为其提供 reaction handler 的 promise 的 capability。
[[Type]] fulfillreject [[Handler]]empty 时,[[Type]] 用于允许特定于敲定类型的行为。
[[Handler]] JobCallback Recordempty 应应用于传入值的函数,其返回值将支配派生 promise 会发生什么。如果 [[Handler]]empty,则改用一个取决于 [[Type]] 值的函数。

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 为一个新的 Abstract Closure,其参数为 (resolution),捕获 promiseOrEmpty,并在被调用时执行以下步骤:
    1. 如果 promiseOrEmpty.[[Value]]empty,则返回 undefined
    2. promisepromiseOrEmpty.[[Value]]
    3. promiseOrEmpty.[[Value]] 设置为 empty
    4. 如果 SameValue(resolution, promise) 是 true,则
      1. selfResolutionError 为一个新创建的 TypeError 对象。
      2. 执行 RejectPromise(promise, selfResolutionError)。
      3. 返回 undefined
    5. 如果 resolution 不是 Object,则
      1. 执行 FulfillPromise(promise, resolution)。
      2. 返回 undefined
    6. thenCompletion(Get(resolution, "then"))。
    7. 如果 then 是 abrupt 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 为一个新的 Abstract Closure,其参数为 (reason),捕获 promiseOrEmpty,并在被调用时执行以下步骤:
    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. 断言: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. 它尝试以类似内置 Promise 构造器的方式,将 ctor 用作构造器来创建 promise,并提取其 resolvereject 函数。该 promise 加上 resolvereject 函数用于初始化新的 PromiseCapability Record。 It performs the following steps when called:

  1. 如果 IsConstructor(ctor) 是 false,则抛出 TypeError 异常。
  2. 注:假定 ctor 是支持 Promise 构造器参数约定的构造函数(见 27.5.3.1)。
  3. resolvingFuncsRecord { [[Resolve]]: undefined, [[Reject]]: undefined }。
  4. executorClosure 为一个新的 Abstract Closure,其参数为 (resolve, reject),捕获 resolvingFuncs,并在被调用时执行以下步骤:
    1. 如果 resolvingFuncs.[[Resolve]] 不是 undefined,则抛出 TypeError 异常。
    2. 如果 resolvingFuncs.[[Reject]] 不是 undefined,则抛出 TypeError 异常。
    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 异常。
  8. 如果 IsCallable(resolvingFuncs.[[Reject]]) 是 false,则抛出 TypeError 异常。
  9. 返回 PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFuncs.[[Resolve]], [[Reject]]: resolvingFuncs.[[Reject]] }。
Note

抽象操作支持 Promise 子类化,因为它对任何会以与 Promise 构造器相同方式调用所传 executor 函数实参的构造器都是泛型的。它用于将 Promise 构造器的静态方法泛化到任何子类。

27.5.1.6 IsPromise ( arg )

The abstract operation IsPromise takes argument arg (an ECMAScript language value) and returns a Boolean. 它检查对象上的 promise 品牌。 It performs the following steps when called:

  1. 如果 arg 不是 Object,则返回 false
  2. 如果 arg 没有 [[PromiseState]] 内部槽,则返回 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. 断言: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 入队一个新的 Job。每个这样的 Job 会处理 PromiseReaction Record[[Type]][[Handler]],并且如果 [[Handler]] 不是 empty,则以给定实参调用它。如果 [[Handler]]empty,则行为由 [[Type]] 决定。 It performs the following steps when called:

  1. reactions 的每个元素 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. 它允许宿主环境跟踪 promise 拒绝。

HostPromiseRejectionTracker 的默认实现是返回 unused

Note 1

HostPromiseRejectionTracker 在两种场景中被调用:

  • 当 promise 在没有任何 handler 的情况下被拒绝时,它会以 operation 实参设置为 "reject" 被调用。
  • 当第一次向已拒绝的 promise 添加 handler 时,它会以 operation 实参设置为 "handle" 被调用。

HostPromiseRejectionTracker 的典型实现可能会尝试向开发者通知未处理的拒绝,同时也会小心地在这类先前通知之后因附加新 handler 而失效时通知开发者。

Note 2

如果 operation"handle",实现不应以会干扰垃圾回收的方式持有对 promise 的引用。如果 operation"reject",则实现可以持有对 promise 的引用,因为预期拒绝是少见的,并且不在热代码路径上。

27.5.2 Promise Job

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). 它返回一个新的 Job Abstract Closure,该 Closure 会将适当的 handler 应用于传入值,并使用该 handler 的返回值来解决或拒绝与该 handler 关联的派生 promise。 It performs the following steps when called:

  1. job 为一个新的无参数 Job Abstract Closure,它捕获 reactionarg,并在被调用时执行以下步骤:
    1. promiseCapabilityreaction.[[Capability]]
    2. typereaction.[[Type]]
    3. handlerreaction.[[Handler]]
    4. 如果 handlerempty,则
      1. 如果 typefulfill,则
        1. handlerResultNormalCompletion(arg)。
      2. 否则,
        1. 断言:typereject
        2. handlerResultThrowCompletion(arg)。
    5. 否则,
      1. handlerResultCompletion(HostCallJobCallback(handler, undefined, « arg »))。
    6. 如果 promiseCapabilityundefined,则
      1. 断言:handlerResult 不是 abrupt completion。
      2. 返回 empty
    7. 断言:promiseCapabilityPromiseCapability Record
    8. 如果 handlerResult 是 abrupt 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. 如果 getHandlerRealmResult 是 normal completion,则将 handlerRealm 设置为 getHandlerRealmResult.[[Value]]
    3. 否则,将 handlerRealm 设置为当前 Realm Record
    4. 注:除非 handler 是 undefined,否则 handlerRealm 永远不是 null。当 handler 是已撤销 Proxy 且没有 ECMAScript 代码运行时,handlerRealm 用于创建错误对象。
  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 为一个新的无参数 Job Abstract Closure,它捕获 promiseToResolvethenablethen,并在被调用时执行以下步骤:
    1. resolvingFuncsCreateResolvingFunctions(promiseToResolve)。
    2. thenCallResultCompletion(HostCallJobCallback(then, thenable, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »))。
    3. 如果 thenCallResult 是 abrupt completion,则
      1. 返回 ? Call(resolvingFuncs.[[Reject]], undefined, « thenCallResult.[[Value]] »)。
    4. 返回 ! thenCallResult
  2. getThenRealmResultCompletion(GetFunctionRealm(then.[[Callback]]))。
  3. 如果 getThenRealmResult 是 normal completion,则令 thenRealmgetThenRealmResult.[[Value]]
  4. 否则,令 thenRealm当前 Realm Record
  5. 注:thenRealm 永远不是 null。当 then.[[Callback]] 是已撤销 Proxy 且没有代码运行时,thenRealm 用于创建错误对象。
  6. 返回 Record { [[Job]]: job, [[Realm]]: thenRealm }。
Note

Job 使用所提供的 thenable 及其 then 方法来解决给定 promise。此过程必须作为 Job 发生,以确保 then 方法的求值发生在任何 surrounding code 的求值完成之后。

27.5.3 Promise 构造器

Promise 构造器:

  • %Promise%
  • 全局对象"Promise" 属性的初始值。
  • 在作为构造器调用时创建并初始化一个新的 Promise。
  • 不意图作为函数调用,并且以这种方式调用时会抛出异常。
  • 可以用作类定义的 extends 子句中的值。打算继承指定 Promise 行为的子类构造函数,必须包含一次对 Promise 构造函数super 调用,以创建并初始化子类实例,使其具备支持 PromisePromise.prototype 的内置方法所必需的内部状态。

27.5.3.1 Promise ( executor )

此函数在被调用时执行以下步骤:

  1. 如果 NewTarget 是 undefined,则抛出 TypeError 异常。
  2. 如果 IsCallable(executor) 是 false,则抛出 TypeError 异常。
  3. promise 为 ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] »)。
  4. promise.[[PromiseState]] 设置为 pending
  5. promise.[[PromiseResult]] 设置为 empty
  6. promise.[[PromiseFulfillReactions]] 设置为新的空 List
  7. promise.[[PromiseRejectReactions]] 设置为新的空 List
  8. promise.[[PromiseIsHandled]] 设置为 false
  9. resolvingFuncsCreateResolvingFunctions(promise)。
  10. completionCompletion(Call(executor, undefined, « resolvingFuncs.[[Resolve]], resolvingFuncs.[[Reject]] »))。
  11. 如果 completion 是 abrupt completion,则
    1. 执行 ? Call(resolvingFuncs.[[Reject]], undefined, « completion.[[Value]] »)。
  12. 返回 promise
Note

executor 实参必须是 function object。它被调用以启动和报告此 Promise 所表示的可能延迟动作的完成情况。executor 以两个实参调用:resolvereject。这些函数可由 executor 函数使用,以报告延迟计算的最终完成或失败。从 executor 函数返回并不表示延迟动作已完成,而只表示最终执行该延迟动作的请求已被接受。

传给 executor 函数的 resolve 函数接受单个实参。executor 代码最终可以调用 resolve 函数,以指示它希望解决关联的 Promise。传给 resolve 函数的实参表示延迟动作的最终值,可以是实际的兑现值,也可以是另一个 promise,如果该 promise 被兑现,则它将提供该值。

传给 executor 函数的 reject 函数接受单个实参。executor 代码最终可以调用 reject 函数,以指示关联的 Promise 被拒绝且永远不会被兑现。传给 reject 函数的实参用作该 promise 的拒绝值。通常它会是 Error 对象。

Promise 构造器传给 executor 函数的 resolve 和 reject 函数具有实际解决和拒绝关联 promise 的能力。子类可以有不同的构造器行为,传入自定义的 resolve 和 reject 值。

27.5.4 Promise 构造器的属性

Promise 构造器:

27.5.4.1 Promise.all ( iterable )

此函数返回一个新的 promise,该 promise 以所传 promise 的兑现值数组兑现,或者以第一个被拒绝的所传 promise 的理由拒绝。它在运行此算法时会将所传 iterable 的所有元素解决为 promise。

  1. ctorthis 值。
  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. 如果 result 是 abrupt completion,则
    1. 如果 iteratorRecord.[[Done]]false,则将 result 设置为 Completion(IteratorClose(iteratorRecord, result))。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. 返回 ! result
Note

此函数要求其 this 值是支持 Promise 构造器参数约定的构造函数

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 异常。
  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 为新的空 List
  2. 注:remainingElementsCount 从 1 而不是 0 开始,以确保 resultCapability.[[Resolve]] 只被调用一次,即使存在行为不当的 "then" 在输入 iterator 耗尽之前调用传入的回调。
  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. undefined 追加到 values
    4. nextPromise 为 ? Call(promiseResolve, ctor, « next »)。
    5. fulfilledSteps 为一个新的 Abstract Closure,其参数为 (value),捕获 valuesresultCapabilityremainingElementsCount,并在被调用时执行以下步骤:
      1. activeFunc活动函数对象
      2. 如果 activeFunc.[[AlreadyCalled]]true,则返回 undefined
      3. activeFunc.[[AlreadyCalled]] 设置为 true
      4. thisIndexactiveFunc.[[Index]]
      5. values[thisIndex] 设置为 value
      6. remainingElementsCount.[[Value]] 设置为 remainingElementsCount.[[Value]] - 1。
      7. 如果 remainingElementsCount.[[Value]] = 0,则
        1. valuesArrayCreateArrayFromList(values)。
        2. 返回 ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)。
      8. 返回 undefined
    6. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)。
    7. onFulfilled.[[AlreadyCalled]] 设置为 false
    8. onFulfilled.[[Index]] 设置为 index
    9. index 设置为 index + 1。
    10. remainingElementsCount.[[Value]] 设置为 remainingElementsCount.[[Value]] + 1。
    11. 执行 ? Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] »)。

27.5.4.2 Promise.allSettled ( iterable )

此函数返回一个 promise,该 promise 会以 promise 状态快照数组兑现,但只有在所有原始 promise 都已敲定,即变为已兑现或已拒绝之后才会兑现。它在运行此算法时会将所传 iterable 的所有元素解决为 promise。

  1. ctorthis 值。
  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. 如果 result 是 abrupt completion,则
    1. 如果 iteratorRecord.[[Done]]false,则将 result 设置为 Completion(IteratorClose(iteratorRecord, result))。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. 返回 ! result
Note

此函数要求其 this 值是支持 Promise 构造器参数约定的构造函数

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 为新的空 List
  2. 注:remainingElementsCount 从 1 而不是 0 开始,以确保 resultCapability.[[Resolve]] 只被调用一次,即使存在行为不当的 "then" 在输入 iterator 耗尽之前调用传入的某个回调。
  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. undefined 追加到 values
    4. nextPromise 为 ? Call(promiseResolve, ctor, « next »)。
    5. alreadyCalledRecord { [[Value]]: false }。
    6. fulfilledSteps 为一个新的 Abstract Closure,其参数为 (value),捕获 valuesresultCapabilityremainingElementsCount,并在被调用时执行以下步骤:
      1. activeFunc活动函数对象
      2. 如果 activeFunc.[[AlreadyCalled]].[[Value]]true,则返回 undefined
      3. activeFunc.[[AlreadyCalled]].[[Value]] 设置为 true
      4. objOrdinaryObjectCreate(%Object.prototype%)。
      5. 执行 ! CreateDataPropertyOrThrow(obj, "status", "fulfilled")。
      6. 执行 ! CreateDataPropertyOrThrow(obj, "value", value)。
      7. thisIndexactiveFunc.[[Index]]
      8. values[thisIndex] 设置为 obj
      9. remainingElementsCount.[[Value]] 设置为 remainingElementsCount.[[Value]] - 1。
      10. 如果 remainingElementsCount.[[Value]] = 0,则
        1. valuesArrayCreateArrayFromList(values)。
        2. 返回 ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)。
      11. 返回 undefined
    7. onFulfilledCreateBuiltinFunction(fulfilledSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)。
    8. onFulfilled.[[AlreadyCalled]] 设置为 alreadyCalled
    9. onFulfilled.[[Index]] 设置为 index
    10. rejectedSteps 为一个新的 Abstract Closure,其参数为 (error),捕获 valuesresultCapabilityremainingElementsCount,并在被调用时执行以下步骤:
      1. activeFunc活动函数对象
      2. 如果 activeFunc.[[AlreadyCalled]].[[Value]]true,则返回 undefined
      3. activeFunc.[[AlreadyCalled]].[[Value]] 设置为 true
      4. objOrdinaryObjectCreate(%Object.prototype%)。
      5. 执行 ! CreateDataPropertyOrThrow(obj, "status", "rejected")。
      6. 执行 ! CreateDataPropertyOrThrow(obj, "reason", error)。
      7. thisIndexactiveFunc.[[Index]]
      8. values[thisIndex] 设置为 obj
      9. remainingElementsCount.[[Value]] 设置为 remainingElementsCount.[[Value]] - 1。
      10. 如果 remainingElementsCount.[[Value]] = 0,则
        1. valuesArrayCreateArrayFromList(values)。
        2. 返回 ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)。
      11. 返回 undefined
    11. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)。
    12. onRejected.[[AlreadyCalled]] 设置为 alreadyCalled
    13. onRejected.[[Index]] 设置为 index
    14. index 设置为 index + 1。
    15. remainingElementsCount.[[Value]] 设置为 remainingElementsCount.[[Value]] + 1。
    16. 执行 ? Invoke(nextPromise, "then", « onFulfilled, onRejected »)。

27.5.4.3 Promise.any ( iterable )

此函数返回一个 promise,该 promise 由第一个被兑现的给定 promise 兑现;或者如果所有给定 promise 都被拒绝,则以持有拒绝理由的 AggregateError 拒绝。它在运行此算法时会将所传 iterable 的所有元素解决为 promise。

  1. ctorthis 值。
  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. 如果 result 是 abrupt completion,则
    1. 如果 iteratorRecord.[[Done]]false,则将 result 设置为 Completion(IteratorClose(iteratorRecord, result))。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. 返回 ! result
Note

此函数要求其 this 值是支持 Promise 构造器参数约定的构造函数

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 为新的空 List
  2. 注:remainingElementsCount 从 1 而不是 0 开始,以确保 resultCapability.[[Reject]] 只被调用一次,即使存在行为不当的 "then" 在输入 iterator 耗尽之前调用传入的回调。
  3. remainingElementsCountRecord { [[Value]]: 1 }。
  4. index 为 0。
  5. 重复,
    1. next 为 ? IteratorStepValue(iteratorRecord)。
    2. 如果 nextdone,则
      1. remainingElementsCount.[[Value]] 设置为 remainingElementsCount.[[Value]] - 1。
      2. 如果 remainingElementsCount.[[Value]] = 0,则
        1. aggregateError 为一个新创建的 AggregateError 对象。
        2. 执行 ! DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) })。
        3. 执行 ? Call(resultCapability.[[Reject]], undefined, « aggregateError »)。
      3. 返回 resultCapability.[[Promise]]
    3. undefined 追加到 errors
    4. nextPromise 为 ? Call(promiseResolve, ctor, « next »)。
    5. rejectedSteps 为一个新的 Abstract Closure,其参数为 (error),捕获 errorsresultCapabilityremainingElementsCount,并在被调用时执行以下步骤:
      1. activeFunc活动函数对象
      2. 如果 activeFunc.[[AlreadyCalled]]true,则返回 undefined
      3. activeFunc.[[AlreadyCalled]] 设置为 true
      4. thisIndexactiveFunc.[[Index]]
      5. errors[thisIndex] 设置为 error
      6. remainingElementsCount.[[Value]] 设置为 remainingElementsCount.[[Value]] - 1。
      7. 如果 remainingElementsCount.[[Value]] = 0,则
        1. aggregateError 为一个新创建的 AggregateError 对象。
        2. 执行 ! DefinePropertyOrThrow(aggregateError, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) })。
        3. 返回 ? Call(resultCapability.[[Reject]], undefined, « aggregateError »)。
      8. 返回 undefined
    6. onRejectedCreateBuiltinFunction(rejectedSteps, 1, "", « [[AlreadyCalled]], [[Index]] »)。
    7. onRejected.[[AlreadyCalled]] 设置为 false
    8. onRejected.[[Index]] 设置为 index
    9. index 设置为 index + 1。
    10. remainingElementsCount.[[Value]] 设置为 remainingElementsCount.[[Value]] + 1。
    11. 执行 ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected »)。

27.5.4.4 Promise.prototype

Promise.prototype 的初始值是 Promise 原型对象

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

27.5.4.5 Promise.race ( iterable )

此函数返回一个新的 promise,其敲定方式与第一个被敲定的所传 promise 相同。它在运行此算法时会将所传 iterable 的所有元素解决为 promise。

  1. ctorthis 值。
  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. 如果 result 是 abrupt completion,则
    1. 如果 iteratorRecord.[[Done]]false,则将 result 设置为 Completion(IteratorClose(iteratorRecord, result))。
    2. IfAbruptRejectPromise(result, promiseCapability)。
  9. 返回 ! result
Note 1

如果 iterable 实参不产生任何值,或者如果 iterable 产生的 promise 都永远不敲定,则此方法返回的待定 promise 永远不会被敲定。

Note 2

此函数期望其 this 值是支持 Promise 构造器参数约定的构造函数。它还期望其 this 值提供 resolve 方法。

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 )

此函数返回一个以传入实参拒绝的新 promise。

  1. ctorthis 值。
  2. promiseCapability 为 ? NewPromiseCapability(ctor)。
  3. 执行 ? Call(promiseCapability.[[Reject]], undefined, « reason »)。
  4. 返回 promiseCapability.[[Promise]]
Note

此函数期望其 this 值是支持 Promise 构造器参数约定的构造函数

27.5.4.7 Promise.resolve ( resolution )

此函数要么返回一个以所传实参解决的新 promise,要么如果该实参是由此构造器产生的 promise,则返回该实参自身。

  1. ctorthis 值。
  2. 如果 ctor 不是 Object,则抛出 TypeError 异常。
  3. 返回 ? PromiseResolve(ctor, resolution)。
Note

此函数期望其 this 值是支持 Promise 构造器参数约定的构造函数

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 解决的新 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 )

此函数在被调用时执行以下步骤:

  1. ctorthis 值。
  2. 如果 ctor 不是 Object,则抛出 TypeError 异常。
  3. promiseCapability 为 ? NewPromiseCapability(ctor)。
  4. statusCompletion(Call(callback, undefined, args))。
  5. 如果 status 是 abrupt completion,则
    1. 执行 ? Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] »)。
  6. 否则,
    1. 执行 ? Call(promiseCapability.[[Resolve]], undefined, « status.[[Value]] »)。
  7. 返回 promiseCapability.[[Promise]]
Note

此函数期望其 this 值是支持 Promise 构造器参数约定的构造函数

27.5.4.9 Promise.withResolvers ( )

此函数返回一个具有三个属性的对象:一个新的 promise,以及与其关联的 resolvereject 函数。

  1. ctorthis 值。
  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 访问器函数是 undefined。其 get 访问器函数在被调用时执行以下步骤:

  1. 返回 this 值。

此函数的 "name" 属性的值是 "get [Symbol.species]"

Note

Promise 原型方法通常使用其 this 值的构造器来创建派生对象。不过,子类构造器可以通过重新定义其 %Symbol.species% 属性来覆盖该默认行为。

27.5.5 Promise 原型对象的属性

Promise 原型对象

  • %Promise.prototype%
  • 具有一个 [[Prototype]] 内部槽,其值为 %Object.prototype%
  • 普通对象
  • 没有 [[PromiseState]] 内部槽,也没有 Promise 实例的任何其他内部槽。

27.5.5.1 Promise.prototype.catch ( onRejected )

此方法在被调用时执行以下步骤:

  1. promisethis 值。
  2. 返回 ? Invoke(promise, "then", « undefined, onRejected »)。

27.5.5.2 Promise.prototype.constructor

Promise.prototype.constructor 的初始值是 %Promise%

27.5.5.3 Promise.prototype.finally ( onFinally )

此方法在被调用时执行以下步骤:

  1. promisethis 值。
  2. 如果 promise 不是 Object,则抛出 TypeError 异常。
  3. ctor 为 ? SpeciesConstructor(promise, %Promise%)。
  4. 断言:IsConstructor(ctor) 是 true
  5. 如果 IsCallable(onFinally) 是 false,则
    1. thenFinallyonFinally
    2. catchFinallyonFinally
  6. 否则,
    1. thenFinallyClosure 为一个新的 Abstract Closure,其参数为 (value),捕获 onFinallyctor,并在被调用时执行以下步骤:
      1. result 为 ? Call(onFinally, undefined)。
      2. p 为 ? PromiseResolve(ctor, result)。
      3. returnValue 为一个新的无参数 Abstract Closure,它捕获 value,并在被调用时执行以下步骤:
        1. 返回 NormalCompletion(value)。
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « »)。
      5. 返回 ? Invoke(p, "then", « valueThunk »)。
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « »)。
    3. catchFinallyClosure 为一个新的 Abstract Closure,其参数为 (reason),捕获 onFinallyctor,并在被调用时执行以下步骤:
      1. result 为 ? Call(onFinally, undefined)。
      2. p 为 ? PromiseResolve(ctor, result)。
      3. throwReason 为一个新的无参数 Abstract Closure,它捕获 reason,并在被调用时执行以下步骤:
        1. 抛出 reason
      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 )

此方法在被调用时执行以下步骤:

  1. promisethis 值。
  2. 如果 IsPromise(promise) 是 false,则抛出 TypeError 异常。
  3. ctor 为 ? SpeciesConstructor(promise, %Promise%)。
  4. resultCapability 为 ? NewPromiseCapability(ctor)。
  5. 返回 PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability)。

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

The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record) and returns an Object or undefined. 它使用 onFulfilledonRejected 作为 promise 的敲定动作,对 promise 执行 “then” 操作。如果传入了 resultCapability,则结果通过更新 resultCapability 的 promise 来存储。如果未传入,则 PerformPromiseThen 是由规范内部操作调用,其结果并不重要。 It performs the following steps when called:

  1. 断言:IsPromise(promise) 是 true
  2. 如果 resultCapability 不存在,则
    1. resultCapability 设置为 undefined
  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. fulfillReaction 追加到 promise.[[PromiseFulfillReactions]]
    2. rejectReaction 追加到 promise.[[PromiseRejectReactions]]
  10. 否则,如果 promise.[[PromiseState]]fulfilled,则
    1. valuepromise.[[PromiseResult]]
    2. fulfillJobNewPromiseReactionJob(fulfillReaction, value)。
    3. 执行 HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]])。
  11. 否则,
    1. 断言:promise.[[PromiseState]]rejected
    2. reasonpromise.[[PromiseResult]]
    3. 如果 promise.[[PromiseIsHandled]]false,则执行 HostPromiseRejectionTracker(promise, "handle")。
    4. rejectJobNewPromiseReactionJob(rejectReaction, reason)。
    5. 执行 HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]])。
  12. promise.[[PromiseIsHandled]] 设置为 true
  13. 如果 resultCapabilityundefined,则返回 undefined
  14. 返回 resultCapability.[[Promise]]

27.5.5.5 Promise.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "Promise"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.5.6 Promise 实例的属性

Promise 实例是普通对象,继承自 Promise 原型对象(固有对象 %Promise.prototype%)的属性。Promise 实例最初创建时具有 Table 93 中描述的内部槽。

Table 93: Promise 实例的内部槽
内部槽 类型 描述
[[PromiseState]] pending, fulfilled, or rejected 支配 promise 将如何对传入的 then 方法调用作出反应。
[[PromiseResult]] ECMAScript 语言值empty promise 已被兑现或拒绝所用的值(如果有)。当且仅当 [[PromiseState]]pending 时为 empty
[[PromiseFulfillReactions]] PromiseReaction RecordList 当/如果 promise 从 pending 状态转换到 fulfilled 状态时要处理的 Record
[[PromiseRejectReactions]] PromiseReaction RecordList 当/如果 promise 从 pending 状态转换到 rejected 状态时要处理的 Record
[[PromiseIsHandled]] Boolean 指示 promise 是否曾经具有兑现或拒绝 handler;用于未处理拒绝跟踪。

27.6 GeneratorFunction 对象

GeneratorFunction 是通常通过求值 GeneratorDeclarationGeneratorExpressionGeneratorMethod 创建的函数。它们也可以通过调用 %GeneratorFunction% 固有对象来创建。

Figure 6 (Informative): Generator 对象关系
大量纵横交错的框和箭头。

27.6.1 GeneratorFunction 构造器

GeneratorFunction 构造器:

  • %GeneratorFunction%
  • Function 的子类。
  • 在作为函数而不是构造器调用时创建并初始化一个新的 GeneratorFunction。因此,函数调用 GeneratorFunction (…) 等价于具有相同实参的对象创建表达式 new GeneratorFunction (…)
  • 可以用作类定义的 extends 子句的值。意图继承指定 GeneratorFunction 行为的子类构造器,必须包含对 GeneratorFunction 构造器的 super 调用,以创建并初始化具有内置 GeneratorFunction 行为所需内部槽的子类实例。所有用于定义 generator function 对象的 ECMAScript 语法形式都会创建 GeneratorFunction 的直接实例。没有语法方式可以创建 GeneratorFunction 子类的实例。

27.6.1.1 GeneratorFunction ( ...paramArgs, bodyArg )

最后一个实参(如果有)指定 generator function 的主体(可执行代码);任何在前的实参指定形式参数。

此函数在被调用时执行以下步骤:

  1. activeFunc活动函数对象
  2. 如果 bodyArg 不存在,则将 bodyArg 设置为空 String。
  3. 返回 ? CreateDynamicFunction(activeFunc, NewTarget, generator, paramArgs, bodyArg)。
Note

20.2.1.1 的注。

27.6.2 GeneratorFunction 构造器的属性

GeneratorFunction 构造器:

  • 是继承自 Function 构造器的标准内置函数对象
  • 具有一个 [[Prototype]] 内部槽,其值为 %Function%
  • 具有一个 "length" 属性,其值为 1𝔽
  • 具有一个 "name" 属性,其值为 "GeneratorFunction"
  • 具有以下属性:

27.6.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype 的初始值是 GeneratorFunction 原型对象

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

27.6.3 GeneratorFunction 原型对象的属性

GeneratorFunction 原型对象

27.6.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructor 的初始值是 %GeneratorFunction%

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.6.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototype 的初始值是 %GeneratorPrototype%

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.6.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "GeneratorFunction"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.6.4 GeneratorFunction 实例

每个 GeneratorFunction 实例都是 ECMAScript 函数对象,并且具有 Table 26 中列出的内部槽。所有这类实例的 [[IsClassConstructor]] 内部槽的值都是 false

每个 GeneratorFunction 实例具有以下自有属性:

27.6.4.1 length

20.2.4.1 中给出的 Function 实例的 "length" 属性规范也适用于 GeneratorFunction 实例。

27.6.4.2 name

20.2.4.2 中给出的 Function 实例的 "name" 属性规范也适用于 GeneratorFunction 实例。

27.6.4.3 prototype

每当创建一个 GeneratorFunction 实例时,还会创建另一个普通对象,并且该对象是 generator function 的 "prototype" 属性的初始值。当使用 [[Call]] 调用 generator function 对象时,该 prototype 属性的值用于初始化新创建的 Generator 的 [[Prototype]] 内部槽。

此属性具有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

Note

不同于 Function 实例,作为 GeneratorFunction 的 "prototype" 属性值的对象没有一个值为该 GeneratorFunction 实例的 "constructor" 属性。

27.7 AsyncGeneratorFunction 对象

AsyncGeneratorFunction 是通常通过求值 AsyncGeneratorDeclarationAsyncGeneratorExpressionAsyncGeneratorMethod 语法产生式创建的函数。它们也可以通过调用 %AsyncGeneratorFunction% 固有对象来创建。

27.7.1 AsyncGeneratorFunction 构造器

AsyncGeneratorFunction 构造器:

  • %AsyncGeneratorFunction%
  • Function 的子类。
  • 在作为函数而不是构造器调用时创建并初始化一个新的 AsyncGeneratorFunction。因此,函数调用 AsyncGeneratorFunction (...) 等价于具有相同实参的对象创建表达式 new AsyncGeneratorFunction (...)
  • 可以用作类定义的 extends 子句的值。意图继承指定 AsyncGeneratorFunction 行为的子类构造器,必须包含对 AsyncGeneratorFunction 构造器的 super 调用,以创建并初始化具有内置 AsyncGeneratorFunction 行为所需内部槽的子类实例。所有用于定义 async generator function 对象的 ECMAScript 语法形式都会创建 AsyncGeneratorFunction 的直接实例。没有语法方式可以创建 AsyncGeneratorFunction 子类的实例。

27.7.1.1 AsyncGeneratorFunction ( ...paramArgs, bodyArg )

最后一个实参(如果有)指定 async generator function 的主体(可执行代码);任何在前的实参指定形式参数。

此函数在被调用时执行以下步骤:

  1. activeFunc活动函数对象
  2. 如果 bodyArg 不存在,则将 bodyArg 设置为空 String。
  3. 返回 ? CreateDynamicFunction(activeFunc, NewTarget, async-generator, paramArgs, bodyArg)。
Note

20.2.1.1 的注。

27.7.2 AsyncGeneratorFunction 构造器的属性

AsyncGeneratorFunction 构造器:

  • 是继承自 Function 构造器的标准内置函数对象
  • 具有一个 [[Prototype]] 内部槽,其值为 %Function%
  • 具有一个 "length" 属性,其值为 1𝔽
  • 具有一个 "name" 属性,其值为 "AsyncGeneratorFunction"
  • 具有以下属性:

27.7.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype 的初始值是 AsyncGeneratorFunction 原型对象

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

27.7.3 AsyncGeneratorFunction 原型对象的属性

AsyncGeneratorFunction 原型对象

27.7.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructor 的初始值是 %AsyncGeneratorFunction%

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.7.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototype 的初始值是 %AsyncGeneratorPrototype%

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.7.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "AsyncGeneratorFunction"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.7.4 AsyncGeneratorFunction 实例

每个 AsyncGeneratorFunction 实例都是 ECMAScript 函数对象,并且具有 Table 26 中列出的内部槽。所有这类实例的 [[IsClassConstructor]] 内部槽的值都是 false

每个 AsyncGeneratorFunction 实例具有以下自有属性:

27.7.4.1 length

"length" 属性的值是一个整数 Number,指示 AsyncGeneratorFunction 通常期望的实参数量。不过,语言允许以其他数量的实参调用函数。当 AsyncGeneratorFunction 以不同于其 "length" 属性所指定数量的实参数量调用时,其行为取决于该函数。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.7.4.2 name

20.2.4.2 中给出的 Function 实例的 "name" 属性规范也适用于 AsyncGeneratorFunction 实例。

27.7.4.3 prototype

每当创建一个 AsyncGeneratorFunction 实例时,还会创建另一个普通对象,并且该对象是 async generator function 的 "prototype" 属性的初始值。当使用 [[Call]] 调用 generator function 对象时,该 prototype 属性的值用于初始化新创建的 AsyncGenerator 的 [[Prototype]] 内部槽。

此属性具有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

Note

不同于 function 实例,作为 AsyncGeneratorFunction 的 "prototype" 属性值的对象没有一个值为该 AsyncGeneratorFunction 实例的 "constructor" 属性。

27.8 Generator 对象

Generator 通过调用 generator function 创建,并且同时符合 iterator 接口iterable 接口

Generator 实例直接继承创建该实例的 generator function 的 "prototype" 属性初始值上的属性。Generator 实例间接继承 %GeneratorPrototype% 上的属性。

27.8.1 %GeneratorPrototype% 对象

%GeneratorPrototype% 对象:

  • %GeneratorFunction.prototype.prototype%
  • 普通对象
  • 不是 Generator 实例,并且没有 [[GeneratorState]] 内部槽。
  • 具有一个 [[Prototype]] 内部槽,其值为 %Iterator.prototype%
  • 具有由所有 Generator 实例间接继承的属性。

27.8.1.1 %GeneratorPrototype%.constructor

%GeneratorPrototype%.constructor 的初始值是 %GeneratorFunction.prototype%

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.8.1.2 %GeneratorPrototype%.next ( value )

  1. 返回 ? GeneratorResume(this 值, value, empty)。

27.8.1.3 %GeneratorPrototype%.return ( value )

此方法在被调用时执行以下步骤:

  1. genthis 值。
  2. completionReturnCompletion(value)。
  3. 返回 ? GeneratorResumeAbrupt(gen, completion, empty)。

27.8.1.4 %GeneratorPrototype%.throw ( exception )

此方法在被调用时执行以下步骤:

  1. genthis 值。
  2. completionThrowCompletion(exception)。
  3. 返回 ? GeneratorResumeAbrupt(gen, completion, empty)。

27.8.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "Generator"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.8.2 Generator 实例的属性

Generator 实例最初创建时具有 Table 94 中描述的内部槽。

Table 94: Generator 实例的内部槽
内部槽 类型 描述
[[GeneratorState]] suspended-start, suspended-yield, executing, or completed generator 的当前执行状态。
[[GeneratorContext]] execution context 执行此 generator 的代码时使用的执行上下文。
[[GeneratorBrand]] String 或 empty 用于区分不同种类 generator 的品牌。由 ECMAScript 源文本声明的 generator 的 [[GeneratorBrand]] 始终是 empty

27.8.3 Generator 抽象操作

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. 断言:gen.[[GeneratorState]]suspended-start
  2. genContext 为运行中的执行上下文。
  3. genContext 的 Generator 组件设置为 gen
  4. closure 为一个新的无参数 Abstract Closure,它捕获 genBody,并在被调用时执行以下步骤:
    1. acGenContext 为运行中的执行上下文。
    2. acGenacGenContext 的 Generator 组件。
    3. 如果 genBodyParse Node,则
      1. resultgenBody 的求值的 Completion
    4. 否则,
      1. 断言:genBody 是无参数 Abstract Closure
      2. resultCompletion(genBody())。
    5. 断言:如果我们返回到这里,则该 generator 要么抛出了异常,要么执行了隐式或显式 return。
    6. 从执行上下文栈中移除 acGenContext,并将执行上下文栈顶部的执行上下文恢复为运行中的执行上下文。
    7. acGen.[[GeneratorState]] 设置为 completed
    8. 注:一旦 generator 进入 completed 状态,它就永远不会离开该状态,其关联执行上下文也永远不会恢复。此时可以丢弃与 acGen 关联的任何执行状态。
    9. 如果 result 是 normal completion,则
      1. resultValueundefined
    10. 否则,如果 result 是 return completion,则
      1. resultValueresult.[[Value]]
    11. 否则,
      1. 断言:result 是 throw completion。
      2. 返回 ? result
    12. 返回 NormalCompletion(CreateIteratorResultObject(resultValue, true))。
  5. 设置 genContext 的代码求值状态,使得当该执行上下文恢复求值时,将以无实参调用 closure
  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 异常。
  4. 断言:gen 具有 [[GeneratorContext]] 内部槽。
  5. stategen.[[GeneratorState]]
  6. 如果 stateexecuting,则抛出 TypeError 异常。
  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. 断言:statesuspended-startsuspended-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. 注:一旦 generator 进入 completed 状态,它就永远不会离开该状态,其关联执行上下文也永远不会恢复。此时可以丢弃与 gen 关联的任何执行状态。
    3. state 设置为 completed
  3. 如果 statecompleted,则
    1. 如果 abruptCompletion 是 return completion,则
      1. 返回 CreateIteratorResultObject(abruptCompletion.[[Value]], true)。
    2. 返回 ? abruptCompletion
  4. 断言: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. genContext 为运行中的执行上下文。
  2. 如果 genContext 没有 Generator 组件,则返回 non-generator
  3. gengenContext 的 Generator 组件。
  4. 如果 gen 具有 [[AsyncGeneratorState]] 内部槽,则返回 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. 断言:genContext 是一个生成器的执行上下文。
  3. gengenContext 的 Generator 组件的值。
  4. 断言:GetGeneratorKind() 是 sync
  5. gen.[[GeneratorState]] 设置为 suspended-yield
  6. 返回 ? 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. 注:closure 可以包含 Yield 操作的使用,以产生 IteratorResult 对象。
  2. 如果 extraSlots 不存在,则将 extraSlots 设置为新的空 List
  3. internalSlotsListextraSlots 和 « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] » 的列表连接
  4. genOrdinaryObjectCreate(genProto, internalSlotsList)。
  5. gen.[[GeneratorBrand]] 设置为 genBrand
  6. gen.[[GeneratorState]] 设置为 suspended-start
  7. callerContext 为运行中的执行上下文。
  8. calleeContext 为新的执行上下文。
  9. calleeContext 的 Function 设置为 null
  10. calleeContextRealm 设置为当前 Realm Record
  11. calleeContext 的 ScriptOrModule 设置为 callerContext 的 ScriptOrModule。
  12. 如果 callerContext 尚未挂起,则挂起 callerContext
  13. calleeContext 压入执行上下文栈;calleeContext 现在是运行中的执行上下文。
  14. 执行 GeneratorStart(gen, closure)。
  15. 从执行上下文栈中移除 calleeContext,并将 callerContext 恢复为运行中的执行上下文。
  16. 返回 gen

27.9 AsyncGenerator 对象

AsyncGenerator 通过调用 async generator function 创建,并且同时符合 async iterator 接口async iterable 接口

AsyncGenerator 实例直接继承创建该实例的 async generator function 的 "prototype" 属性初始值上的属性。AsyncGenerator 实例间接继承 %AsyncGeneratorPrototype% 上的属性。

27.9.1 %AsyncGeneratorPrototype% 对象

%AsyncGeneratorPrototype% 对象:

  • %AsyncGeneratorFunction.prototype.prototype%
  • 普通对象
  • 不是 AsyncGenerator 实例,并且没有 [[AsyncGeneratorState]] 内部槽。
  • 具有一个 [[Prototype]] 内部槽,其值为 %AsyncIteratorPrototype%
  • 具有由所有 AsyncGenerator 实例间接继承的属性。

27.9.1.1 %AsyncGeneratorPrototype%.constructor

%AsyncGeneratorPrototype%.constructor 的初始值是 %AsyncGeneratorFunction.prototype%

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.9.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. genthis 值。
  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-startsuspended-yield,则
    1. 执行 AsyncGeneratorResume(gen, completion)。
  10. 否则,
    1. 断言:stateexecutingdraining-queue
  11. 返回 promiseCapability.[[Promise]]

27.9.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. genthis 值。
  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-startcompleted,则
    1. gen.[[AsyncGeneratorState]] 设置为 draining-queue
    2. 执行 AsyncGeneratorAwaitReturn(gen)。
  9. 否则,如果 statesuspended-yield,则
    1. 执行 AsyncGeneratorResume(gen, completion)。
  10. 否则,
    1. 断言:stateexecutingdraining-queue
  11. 返回 promiseCapability.[[Promise]]

27.9.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. genthis 值。
  2. promiseCapability 为 ! NewPromiseCapability(%Promise%)。
  3. resultCompletion(AsyncGeneratorValidate(gen, empty))。
  4. IfAbruptRejectPromise(result, promiseCapability)。
  5. stategen.[[AsyncGeneratorState]]
  6. 如果 statesuspended-start,则
    1. gen.[[AsyncGeneratorState]] 设置为 completed
    2. state 设置为 completed
  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. 断言:stateexecutingdraining-queue
  12. 返回 promiseCapability.[[Promise]]

27.9.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "AsyncGenerator"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.9.2 AsyncGenerator 实例的属性

AsyncGenerator 实例最初创建时具有下面描述的内部槽:

Table 95: AsyncGenerator 实例的内部槽
内部槽 类型 描述
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, or completed async generator 的当前执行状态。
[[AsyncGeneratorContext]] execution context 执行此 async generator 的代码时使用的执行上下文。
[[AsyncGeneratorQueue]] AsyncGeneratorRequest RecordList 表示恢复 async generator 请求的 Record。除状态转换期间外,当且仅当 [[AsyncGeneratorState]]executingdraining-queue 时,它才非空。
[[GeneratorBrand]] String 或 empty 用于区分不同种类 async generator 的品牌。由 ECMAScript 源文本声明的 async generator 的 [[GeneratorBrand]] 始终是 empty

27.9.3 AsyncGenerator 抽象操作

27.9.3.1 AsyncGeneratorRequest Record

AsyncGeneratorRequest 是一种 Record 值,用于存储 async generator 应如何恢复的信息,并包含用于兑现或拒绝相应 promise 的 capability。

它们具有以下字段:

Table 96: AsyncGeneratorRequest Record 字段
字段名 含义
[[Completion]] Completion Record 应用来恢复 async generator 的 Completion Record
[[Capability]] PromiseCapability Record 与此请求关联的 promise capability。

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. 断言:gen.[[AsyncGeneratorState]]suspended-start
  2. genContext 为运行中的执行上下文。
  3. genContext 的 Generator 组件设置为 gen
  4. closure 为一个新的无参数 Abstract Closure,它捕获 genBody,并在被调用时执行以下步骤:
    1. acGenContext 为运行中的执行上下文。
    2. acGenacGenContext 的 Generator 组件。
    3. 如果 genBodyParse Node,则
      1. resultgenBody 的求值的 Completion
    4. 否则,
      1. 断言:genBody 是无参数 Abstract Closure
      2. resultCompletion(genBody())。
    5. 断言:如果我们返回到这里,则该 async generator 要么抛出了异常,要么执行了隐式或显式 return。
    6. 从执行上下文栈中移除 acGenContext,并将执行上下文栈顶部的执行上下文恢复为运行中的执行上下文。
    7. acGen.[[AsyncGeneratorState]] 设置为 draining-queue
    8. 如果 result 是 normal completion,则将 result 设置为 NormalCompletion(undefined)。
    9. 如果 result 是 return completion,则将 result 设置为 NormalCompletion(result.[[Value]])。
    10. 执行 AsyncGeneratorCompleteStep(acGen, result, true)。
    11. 执行 AsyncGeneratorDrainQueue(acGen)。
    12. 返回 NormalCompletion(undefined)。
  5. 设置 genContext 的代码求值状态,使得当该执行上下文恢复求值时,将以无实参调用 closure
  6. gen.[[AsyncGeneratorContext]] 设置为 genContext
  7. gen.[[AsyncGeneratorQueue]] 设置为新的空 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 异常。
  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. request 追加到 gen.[[AsyncGeneratorQueue]]
  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. 断言:gen.[[AsyncGeneratorQueue]] 不是空。
  2. nextgen.[[AsyncGeneratorQueue]] 的第一个元素。
  3. gen.[[AsyncGeneratorQueue]] 中移除第一个元素。
  4. promiseCapabilitynext.[[Capability]]
  5. valuecompletion.[[Value]]
  6. 如果 completion 是 throw completion,则
    1. 执行 ! Call(promiseCapability.[[Reject]], undefined, « value »)。
  7. 否则,
    1. 断言:completion 是 normal completion。
    2. 如果 realm 存在,则
      1. oldRealm 为运行中的执行上下文的 Realm
      2. 将运行中的执行上下文的 Realm 设置为 realm
      3. iteratorResultCreateIteratorResultObject(value, done)。
      4. 将运行中的执行上下文的 Realm 设置为 oldRealm
    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. 断言:gen.[[AsyncGeneratorState]]suspended-startsuspended-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. 如果 resumptionValue 不是 return completion,则返回 ? resumptionValue
  2. awaitedCompletion(Await(resumptionValue.[[Value]]))。
  3. 如果 awaited 是 throw completion,则返回 ? awaited
  4. 断言:awaited 是 normal 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. 断言:genContext 是一个生成器的执行上下文。
  3. gengenContext 的 Generator 组件的值。
  4. 断言:GetGeneratorKind() 是 async
  5. completionNormalCompletion(arg)。
  6. 断言:执行上下文栈至少有两个元素。
  7. previousContext 为执行上下文栈中从栈顶数第二个元素。
  8. previousRealmpreviousContextRealm
  9. 执行 AsyncGeneratorCompleteStep(gen, completion, false, previousRealm)。
  10. queuegen.[[AsyncGeneratorQueue]]
  11. 如果 queue 非空,则
    1. 注:执行会继续,而不会挂起该生成器。
    2. toYieldqueue 的第一个元素。
    3. resumptionValueCompletion(toYield.[[Completion]])。
    4. 返回 ? AsyncGeneratorUnwrapYieldResumption(resumptionValue)。
  12. gen.[[AsyncGeneratorState]] 设置为 suspended-yield
  13. resumptionValueCompletion(RunCallerContext(undefined))。
  14. 返回 ? 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. 断言:gen.[[AsyncGeneratorState]]draining-queue
  2. queuegen.[[AsyncGeneratorQueue]]
  3. 断言:queue 不是空。
  4. nextqueue 的第一个元素。
  5. completionCompletion(next.[[Completion]])。
  6. 断言:completion 是 return completion。
  7. promiseCompletionCompletion(PromiseResolve(%Promise%, completion.[[Value]]))。
  8. 如果 promiseCompletion 是 abrupt completion,则
    1. 执行 AsyncGeneratorCompleteStep(gen, promiseCompletion, true)。
    2. 执行 AsyncGeneratorDrainQueue(gen)。
    3. 返回 unused
  9. 断言:promiseCompletion 是 normal completion。
  10. promisepromiseCompletion.[[Value]]
  11. fulfilledClosure 为一个新的 Abstract Closure,其参数为 (value),捕获 gen,并在被调用时执行以下步骤:
    1. 断言:gen.[[AsyncGeneratorState]]draining-queue
    2. resultNormalCompletion(value)。
    3. 执行 AsyncGeneratorCompleteStep(gen, result, true)。
    4. 执行 AsyncGeneratorDrainQueue(gen)。
    5. 返回 NormalCompletion(undefined)。
  12. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « »)。
  13. rejectedClosure 为一个新的 Abstract Closure,其参数为 (reason),捕获 gen,并在被调用时执行以下步骤:
    1. 断言: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. 它清空 generator 的 AsyncGeneratorQueue,直到遇到持有 return completion 的 AsyncGeneratorRequest。 It performs the following steps when called:

  1. 断言:gen.[[AsyncGeneratorState]]draining-queue
  2. queuegen.[[AsyncGeneratorQueue]]
  3. 重复,只要 queue 不是空,
    1. nextqueue 的第一个元素。
    2. completionCompletion(next.[[Completion]])。
    3. 如果 completion 是 return completion,则
      1. 执行 AsyncGeneratorAwaitReturn(gen)。
      2. 返回 unused
    4. 如果 completion 是 normal completion,则
      1. completion 设置为 NormalCompletion(undefined)。
    5. 执行 AsyncGeneratorCompleteStep(gen, completion, true)。
  4. gen.[[AsyncGeneratorState]] 设置为 completed
  5. 返回 unused

27.10 AsyncFunction 对象

AsyncFunction 是通常通过求值 AsyncFunctionDeclarationAsyncFunctionExpressionAsyncMethodAsyncArrowFunction 创建的函数。它们也可以通过调用 %AsyncFunction% 固有对象来创建。

27.10.1 AsyncFunction 构造器

AsyncFunction 构造器:

  • %AsyncFunction%
  • Function 的子类。
  • 在作为函数而不是构造器调用时创建并初始化一个新的 AsyncFunction。因此,函数调用 AsyncFunction(…) 等价于具有相同实参的对象创建表达式 new AsyncFunction(…)
  • 可以用作类定义的 extends 子句的值。意图继承指定 AsyncFunction 行为的子类构造器,必须包含对 AsyncFunction 构造器的 super 调用,以创建并初始化具有内置 async function 行为所需内部槽的子类实例。所有用于定义 async function 对象的 ECMAScript 语法形式都会创建 AsyncFunction 的直接实例。没有语法方式可以创建 AsyncFunction 子类的实例。

27.10.1.1 AsyncFunction ( ...paramArgs, bodyArg )

最后一个实参(如果有)指定 async function 的主体(可执行代码)。任何在前的实参指定形式参数。

此函数在被调用时执行以下步骤:

  1. activeFunc活动函数对象
  2. 如果 bodyArg 不存在,则将 bodyArg 设置为空 String。
  3. 返回 ? CreateDynamicFunction(activeFunc, NewTarget, async, paramArgs, bodyArg)。
Note
20.2.1.1 的注。

27.10.2 AsyncFunction 构造器的属性

AsyncFunction 构造器:

  • 是继承自 Function 构造器的标准内置函数对象
  • 具有一个 [[Prototype]] 内部槽,其值为 %Function%
  • 具有一个 "length" 属性,其值为 1𝔽
  • 具有一个 "name" 属性,其值为 "AsyncFunction"
  • 具有以下属性:

27.10.2.1 AsyncFunction.prototype

AsyncFunction.prototype 的初始值是 AsyncFunction 原型对象

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

27.10.3 AsyncFunction 原型对象的属性

AsyncFunction 原型对象

27.10.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructor 的初始值是 %AsyncFunction%

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.10.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "AsyncFunction"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

27.10.4 AsyncFunction 实例

每个 AsyncFunction 实例都是 ECMAScript 函数对象,并且具有 Table 26 中列出的内部槽。所有这类实例的 [[IsClassConstructor]] 内部槽的值都是 false。AsyncFunction 实例不是构造器,并且没有 [[Construct]] 内部方法。AsyncFunction 实例没有 prototype 属性,因为它们不可构造。

每个 AsyncFunction 实例具有以下自有属性:

27.10.4.1 length

20.2.4.1 中给出的 Function 实例的 "length" 属性规范也适用于 AsyncFunction 实例。

27.10.4.2 name

20.2.4.2 中给出的 Function 实例的 "name" 属性规范也适用于 AsyncFunction 实例。

27.10.5 Async Function 的抽象操作

27.10.5.1 AsyncFunctionStart ( promiseCapability, asyncFuncBody )

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. runningContext 为运行中的执行上下文。
  2. asyncContextrunningContext 的副本。
  3. 注:复制执行状态是 AsyncBlockStart 恢复其执行所必需的。恢复一个当前正在执行的上下文是未良定义的。
  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 为一个新的无参数 Abstract Closure,它捕获 promiseCapabilityasyncBody,并在被调用时执行以下步骤:
    1. acAsyncContext 为运行中的执行上下文。
    2. 如果 asyncBodyParse Node,则
      1. resultasyncBody 的求值的 Completion
    3. 否则,
      1. 断言:asyncBody 是无参数 Abstract Closure
      2. resultCompletion(asyncBody())。
    4. 断言:如果我们返回到这里,则该 async function 要么抛出了异常,要么执行了隐式或显式 return;所有等待都已完成。
    5. 从执行上下文栈中移除 acAsyncContext,并将执行上下文栈顶部的执行上下文恢复为运行中的执行上下文。
    6. 如果 result 是 normal completion,则
      1. 执行 ! Call(promiseCapability.[[Resolve]], undefined, « undefined »)。
    7. 否则,如果 result 是 return completion,则
      1. 执行 ! Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] »)。
    8. 否则,
      1. 断言:result 是 throw completion。
      2. 执行 ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] »)。
    9. 返回 NormalCompletion(unused)。
  2. 设置 asyncContext 的代码求值状态,使得当该执行上下文恢复求值时,将以无实参调用 closure
  3. result 为 ! RunSuspendedContext(asyncContext, NormalCompletion(empty))。
  4. 断言:resultunused
  5. 注:result 值的可能来源是 Await,或者如果 async function 没有等待任何内容,则为上面的步骤 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 为一个新的抽象闭包,其参数为 (v),它捕获 asyncContext 并在被调用时执行以下步骤:
    1. 执行 Completion(RunSuspendedContext(asyncContext, NormalCompletion(v)))。
    2. 注:RunSuspendedContext 返回的完成记录会被有意忽略。
    3. 返回 NormalCompletion(undefined)。
  4. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « »)。
  5. rejectedClosure 为一个新的抽象闭包,其参数为 (reason),它捕获 asyncContext 并在被调用时执行以下步骤:
    1. 执行 Completion(RunSuspendedContext(asyncContext, ThrowCompletion(reason)))。
    2. 注:RunSuspendedContext 返回的完成记录会被有意忽略。
    3. 返回 NormalCompletion(undefined)。
  6. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « »)。
  7. 执行 PerformPromiseThen(promise, onFulfilled, onRejected)。
  8. 返回 ? RunCallerContext(empty)。