Node.js中Promises的执行顺序

时间:2019-01-30 12:56:01

标签: 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'))
  .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()呼叫的顺序混乱了?

2 个答案:

答案 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/了解详细信息。

  

我希望得到以下输出

不要对独立的诺言链承担任何责任。您可以而且应该期望的是,BA之后,CB之后,在另一个链中,E在{{1之后}}和D之后的F。允许任意交错 1 -如果要确保顺序,请使用E将承诺彼此链接。

1:规范详细说明了promise任务的排队方式,以便在不同的引擎实现之间保持一致,但应将这些细节视为无关紧要。