是否可以在promise promise和promise await返回之间执行用户代码?
function a () {
return new Promise(resolve => {
setTimeout(() => {
// Between here...
resolve()
}, 1000))
}
}
async function b () {
await a()
// ...and here ?
}
规范是否强制立即调用Promise回调?我想知道两点之间的虚拟机是否可以处理事件,可能会造成副作用。
答案 0 :(得分:4)
不,它不会立即强制执行。 The spec在解决承诺时会经历一系列步骤,其中之一是:
- 执行EnqueueJob(“PromiseJobs”,PromiseResolveThenableJob,«promise,resolution,thenAction»)
醇>
请注意,根据承诺的状态,可以采用不同的路线。但是,他们都是end at EnqueueJob,其中说:
- 在queueName命名的作业队列后面添加待处理。
醇>
因此,任何进一步的执行都会延迟到作业队列的末尾。
答案 1 :(得分:1)
承诺回调不立即调用。您的函数b()
转换为
function b () {
return a().then(() => {
// Do something
});
}
其中then
的函数在某个时间点被事件循环执行 后,来自a
的承诺得到解决。永远不会同步调用它,因为规范保证Promise continuation始终使用空调用堆栈运行(这意味着在eventloop的新迭代中)。因此,一些其他代码(例如来自另一个promise resolval)可以在解决promise的时间和延续运行的时间之间运行。