【问题标题】:Execution order of Promises in Node.jsNode.js 中 Promises 的执行顺序
【发布时间】:2019-01-30 21:24:58
【问题描述】:

我使用 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() 调用的顺序会混淆?

【问题讨论】:

    标签: javascript node.js promise event-loop


    【解决方案1】:

    setImmediate() 调用告诉我们,没有console.log() 调用被推迟到下一个事件循环迭代

    实际上是这样 - 请记住,promise then 回调是始终异步的。

    它们只是在事件循环的不同阶段运行,它们在不同的任务队列中排队。具体NodeJS,详见文章https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/。

    我希望有以下输出

    不要假设任何关于独立承诺链的事情。你所能想到的只是B在A之后,C在B之后,在另一个链中E在D之后,F在E之后。它们可以任意交错1 - 如果您想确保顺序,请使用then 将promise 相互链接。

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

    【讨论】:

      【解决方案2】:

      有两个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'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-03
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        相关资源
        最近更新 更多