6.1.5 ECMAScript®2020 标准文档 - await

Await

实现步骤:

  1. completion = Await(value)

意味着干了下面这些事情:

假设 :

asynContextAwait(value) 的异步代码的上下文环境

REC:runningExecuteContext 表示当前执行的上下文环境

  1. asyncContext = 当前运行执行上下文(REC) 将控制权交给异步代码
  2. promise = PromiseResolve(%Promise%, << value >>) 保存 resolve() 的执行结果,返回的是个 Promise
  3. stepsFulfilled = AwaitFulfilledFunctions 保存到完成状态需要的步骤
  4. onFulfilled = CreateBuiltinFunction(stepsFulfilled, << [[ AsyncContext ] ]>>)

    用完成状态的过程创建完成状态时的回调函数(onFulfilled),应该就是绑定上下文。

  5. onFulfilled.[[AsyncContext] ] = asyncContext 将异步上下文交给 onFulfilled 函数
  6. stepsRejected = AwaitRejectedFunctions 保存到失败状态需要的步骤
  7. onRejected = CreateBuiltinFunction(stepsRejected, << [[ AsyncContext ] ]>>)
    创建 reject 函数。
  8. onRejected.[[AsyncContext] ] = asyncContext 将异步上下文交给 onRejected 函数

    绑定函数的执行上下文。

  9. 执行 PerformPromiseThen(promise, onFulfilled, onRejected).
  10. 还原执行上下文

    完成了内部函数的创建(onFulfilled, onRejected),以及它们执行上下文的绑定(asyncContext),之后需要将 asyncContext

移除 REC 堆栈,交还给原来的 context (比如: await 之前的同步代码或其他异步代码等)。

  1. 设置 asyncContext 状态,某一个状态完成的时候,那么 stepsFulfilledstepsRejected 会被执行。
  2. 退出函数(Return)
  3. 注意:函数一般会返回先返回之前回复的 asyncContext 相当于另外一个 Promise

Await Fulfilled 函数

一个 Await fulfilled 函数是一个内置的异步函数,是 Await 规范的一部分用来传递 promise fulfilment 的结果值。

Await fulfilled(value) 调用步骤:

  1. F = activeFunctionObject 指向 fulfilled 回调函数,如之前的 onFulfilled
  2. asyncContext = F.[[AsyncContext]] 将异步执行上下文交给 F 表示该 Await 状态结束了,将执行回调
  3. prevContext = runningExecutionContext 保存当前的执行上下文(便于将来恢复)
  4. 挂起 prevContext 需要等待 asyncContext 完成
  5. asyncContext 推入执行上下文堆栈(execution context stack)顶部优先执行,让 asyncContext 成为

当前执行的上下文(running execution context)

  1. NormalCompletion(value) 执行 asyncContext 得出结果
  2. 断言:当达到这一步的时候, asyncContext 已经被移出执行栈,并将 prevContext 还原为了当前执行上下文
  3. 返回 undefined

Await fulfilled 函数的长度属性: length = 1

Await Rejected 函数

rejected 函数和 fulfilled 过程是一样的, 只不过传递出去的结果为失败的理由。

Await rejected(reason) 调用步骤:

  1. F = activeFunctionObject 指向 rejected 回调函数,如之前的 onRejected
  2. asyncContext = F.[[AsyncContext]] 将异步执行上下文交给 F 表示该 Await 状态结束了,将执行回调
  3. prevContext = runningExecutionContext 保存当前的执行上下文(便于将来恢复)
  4. 挂起 prevContext 需要等待 asyncContext 完成
  5. asyncContext 推入执行上下文堆栈(execution context stack)顶部优先执行,让 asyncContext 成为

当前执行的上下文(running execution context)

  1. ThrowCompletion(reason) 执行 asyncContext 得出结果
  2. 断言:当达到这一步的时候, asyncContext 已经被移出执行栈,并将 prevContext 还原为了当前执行上下文
  3. 返回 undefined

Await fulfilled 函数的长度属性: length = 1

0%