我使用Node.js v10.15.0执行了以下代码
Promise.resolve()
.then(() => console.log('A'))
.then(() => console.log('B'))
.then(() => console.log('C'))
setImmediate(() => console.log('IMMEDIATE'))
Promise.resolve()
.then(() => console.log('D'))
.then(() => console.log('E'))
.then(() => console.log('F'))
由于我期望输出后的完整功能没有涉及异步代码
A
B
C
D
E
F
IMMEDIATE
但是我得到了...
A
D
B
E
C
F
IMMEDIATE
据我了解的情况,setImmediate()
调用向我们展示了,没有console.log()
调用受下一次事件循环迭代的影响。但是,为什么console.log()
呼叫的顺序混乱了?
答案 0 :(得分:0)
有两个Promise.resolve()...
承诺链可以并行执行。
A
D
B
E
C
F
是他们的预期订单。
为了顺序执行它们,应该是:
Promise.resolve()
.then(() => console.log('A'))
.then(() => console.log('B'))
.then(() => console.log('C'))
.then(() => Promise.resolve()) // no-op
.then(() => console.log('D'))
.then(() => console.log('E'))
.then(() => console.log('F'))
答案 1 :(得分:0)
setImmediate()
调用向我们显示,没有console.log()
调用被推迟到下一个事件循环迭代
实际上它们确实是-请记住,诺言then
回调总是 异步。
它们只是在事件循环的不同阶段运行,它们在不同的任务队列中排队。对于特定的NodeJS,请参阅文章https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/了解详细信息。
我希望得到以下输出
不要对独立的诺言链承担任何责任。您可以而且应该期望的是,B
在A
之后,C
在B
之后,在另一个链中,E
在{{1之后}}和D
之后的F
。允许任意交错 1 -如果要确保顺序,请使用E
将承诺彼此链接。
1:规范详细说明了promise任务的排队方式,以便在不同的引擎实现之间保持一致,但应将这些细节视为无关紧要。