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



是否可以在承诺解析和承诺等待返回之间执行用户代码?

function a () {
return new Promise(resolve => {
setTimeout(() => {
// Between here...
resolve()
}, 1000))
}
}
async function b () {
await a()
// ...and here ?
}

规范是否强制要求立即调用 Promise 回调?我想知道虚拟机是否可以在 2 点之间处理事件,这可能会引起副作用。

不,它不强制立即调用。 该规范在解决承诺时会经历许多步骤,其中之一是:

  1. 执行队列作业 ("PromiseJobs", PromiseResolveThenableJob, « promise, resolution, thenAction»(

请注意,根据承诺的状态,可以采取不同的路线。 但是,它们都以EnqueueJob结尾,其中说:

  1. 在按 queueName 命名的作业队列的后面添加挂起。

因此,任何进一步的执行都将延迟到作业队列的末尾。

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

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

其中,在解析了来自a的承诺之后,给定给then的函数在某个时间点由事件循环执行。它永远不会被同步调用,因为规范保证 Promise 延续始终使用空调用堆栈运行(这意味着在事件循环的新迭代中(。因此,一些其他代码(例如,来自另一个承诺解析(可以在解析承诺的时间和延续运行时之间运行。

相关内容

  • 没有找到相关文章

最新更新