JavaScript ES6 - 承诺解决和事件之间可能存在竞争条件?

JavaScript ES6 - Possible race condition between promise resolution and event?

是否可以在 promise 解析和 promise 等待之间执行用户代码 return?

function a () {
  return new Promise(resolve => {
    setTimeout(() => {
      // Between here...
      resolve()
    }, 1000))
  }
}

async function b () {
  await a()
  // ...and here ?
}

规范是否强制立即调用 Promise 回调?我想知道2点之间的事件是否可以由虚拟机处理,可能会导致副作用。

不,它不强制立即调用。 The spec 在解决 promise 时会执行多个步骤,其中之一是:

  1. Perform EnqueueJob ("PromiseJobs", PromiseResolveThenableJob, «‍promise, resolution, thenAction»)

请注意,根据承诺的状态,可以采取不同的路线。然而,他们都是 end at EnqueueJob,这表示:

  1. Add pending at the back of the Job Queue named by queueName.

所以任何进一步的执行都被推迟到作业队列的末尾。

Promise 回调不会立即调用。您的函数 b() 转换为

function b () {
  return a().then(() => {
    // Do something
  });
}

其中 then 的函数在某个时间点由事件循环 来自 a 的承诺得到解决后执行。它永远不会被同步调用,因为规范保证 Promise continuations 总是 运行 有一个空的调用堆栈(这意味着在 eventloop 的新迭代中)。因此,一些其他代码(例如来自另一个 promise 解决)可以 运行 在解决 promise 和继续 运行 之间。