【问题标题】:setImmediate() function not being called after process.nextTick() function在 process.nextTick() 函数之后未调用 setImmediate() 函数
【发布时间】:2018-09-12 00:57:58
【问题描述】:

对于这个sn-p:

const foo = [1, 2];
const bar = ['a', 'b'];

foo.forEach( num => {
  console.log(`setting setImmmediate ${num}`);
  setImmediate(() => {
    console.log(`running setImmediate ${num}`);
    bar.forEach(char => {
      console.log(`setting nextTick ${char}`);
      process.nextTick(() => {
        console.log(`running nextTick ${char}`);
      })
    })
  });
} )

输出是

$ node scratch.js                   
setting setImmmediate 1
setting setImmmediate 2
running setImmediate 1
setting nextTick a
setting nextTick b
running setImmediate 2
setting nextTick a
setting nextTick b
running nextTick a
running nextTick b
running nextTick a
running nextTick b

来自docs

nextTickQueue 将在当前操作完成后处理,与事件循环的当前阶段无关。

据我了解,process.nextTick() 将添加到当前事件的nextTickQueue,并在当前事件之后立即执行,无论事件循环处于哪个阶段。

输出不应该是下面的吗?

setting setImmmediate 1
setting setImmmediate 2
running setImmediate 1
setting nextTick a
setting nextTick b
running nextTick a
running nextTick b
running setImmediate 2
setting nextTick a
setting nextTick b
running nextTick a
running nextTick b

【问题讨论】:

    标签: node.js event-loop libuv


    【解决方案1】:

    nextTickQueue 将在 当前操作 完成后处理,与事件循环的当前阶段无关。

    我误解了event loop documentation 认为“当前操作”是指当前正在处理的事件,而实际上它是指当前正在处理的阶段。

    来自 Danial Khan 的What you should know to really understand the Node.js Event Loop/:

    【讨论】:

      猜你喜欢
      • 2016-10-30
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      相关资源
      最近更新 更多