Javascript Node.js中承诺的执行顺序

Javascript Node.js中承诺的执行顺序,javascript,node.js,promise,event-loop,Javascript,Node.js,Promise,Event Loop,我使用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'

我使用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'))
因为fullfilled函数中没有异步代码,所以我希望得到以下输出

A
B
C
D
E
F
IMMEDIATE
但是我得到了

A
D
B
E
C
F
IMMEDIATE

就我所了解的情况而言,
setImmediate()
调用向我们显示,无
console.log()
调用被转移到下一个事件循环迭代。但是,为什么
console.log()
调用的顺序混淆了呢?

有两个
Promise.resolve()…
Promise链是并行执行的

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'))
setImmediate()
调用向我们显示,没有任何
console.log()
调用延迟到下一个事件循环迭代

实际上,它们是这样的-记住promise
then
回调总是异步的

它们只是在事件循环的不同阶段运行,它们在不同的任务队列上排队。具体到nodej,请参阅本文以了解详细信息

我期望以下输出

A
B
C
D
E
F
IMMEDIATE
不要对独立的承诺链做任何假设。你可以而且应该期望的是
B
A
之后,
C
B
之后,
E
D
之后和
F
E
之后。它们可以任意交错1-如果您想确保秩序,请使用
然后
将承诺链接到彼此

1:规范详细说明了promise任务队列是如何工作的,以便在不同的引擎实现之间保持一致,但是这些细节应该被认为是不相关的