关于《深入浅出 Node.js》中 nextTick 和 setImmediate 的一段代码的疑问
发布于 7 年前 作者 zhuscat 4203 次浏览 来自 问答

书上代码如下:

process.nextTick(function () {
  console.log('nextTick延迟执行1');
});

process.nextTick(function () {
  console.log('nextTick延迟执行2');
});

setImmediate(function () {
  console.log('setImmediate 延迟执行1');
  process.nextTick(function () {
    console.log('强势插入');
  });
});

setImmediate(function () {
  console.log('setImmediate延迟执行2');
});

console.log('正常执行');

代码如上,书上说输出顺序是

正常执行
nextTick延迟执行1
nextTick延迟执行2
setImmediate延迟执行1
强势插入
setImmediate延迟执行2

但是我自己运行了一下发现顺序是这样

正常执行
nextTick延迟执行1
nextTick延迟执行2
setImmediate延迟执行1
setImmediate延迟执行2
强势插入

node 的版本为 v6.3.0

这是怎么回事呢?

7 回复

uv__run_check 的机制改了,朴老师写书的时候基于的还是 0.x.x,现在 v6 版本的 idle、check、prepare 队列处理都是一次性处理掉当前任务队列中注册的所有回调,这里两个 immediate 事件回调注册到了 check 队列中,显然会被 uv__run_check 依次执行掉,等 check 队列执行结束后,才会执行在 setImmediate 回调执行中注册的 process.nextTick 函数回调

更多详细可以看:源代码 deps/uv/src/unix/loop-watcher.c 文件

最后,朴老师正在编写 《深入浅出Node.js II》,敬请期待哇~

@hyj1991 原来是这样,多谢。期待新书~~~

我也正感到疑惑正打算测试下。期待II。

变化很快,期待新书

我想知道新书大概什么时候出

@hyj1991 正解,厉害了

新书什么时候出呀,期待

回到顶部