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 时会执行多个步骤,其中之一是:
- Perform EnqueueJob ("PromiseJobs", PromiseResolveThenableJob, «promise, resolution, thenAction»)
请注意,根据承诺的状态,可以采取不同的路线。然而,他们都是 end at EnqueueJob,这表示:
- 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 和继续 运行 之间。
是否可以在 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 时会执行多个步骤,其中之一是:
- Perform EnqueueJob ("PromiseJobs", PromiseResolveThenableJob, «promise, resolution, thenAction»)
请注意,根据承诺的状态,可以采取不同的路线。然而,他们都是 end at EnqueueJob,这表示:
- 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 和继续 运行 之间。