关于《深入浅出 Node.js》中 nextTick 和 setImmediate 的一段代码的疑问
书上代码如下:
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 正解,厉害了
新书什么时候出呀,期待