process.nextTick(function () { console.log('nextTick延迟执行1'); }); setImmediate(function () { console.log('setImmediate延迟执行1'); process.nextTick(function () { console.log('强势插入'); }); setImmediate(function () { console.log('setImmediate'); }); }); setImmediate(function () { console.log('setImmediate延迟执行2'); }); process.nextTick(function () { console.log('nextTick延迟执行2'); process.nextTick(function () { console.log('nextTick延迟执行3'); }); }); setTimeout(function timeout() { console.log('TIMEOUT FIRED'); }, 0); console.log('正常执行');
的输出结果:
正常执行
nextTick延迟执行1nextTick延迟执行2
nextTick延迟执行3
TIMEOUT FIRED
setImmediate延迟执行1
setImmediate延迟执行2
强势插入
setImmediate
这个和深入浅出nodejs书上不一样的结果。以下是我的看法:
process.nextTick()无论是否嵌套都是将全部在当前“执行栈”执行。
setImmediate ():如果一个立即定时器是被一个正在执行的回调排入队列的,则该定时器直到下一次事件循环迭代才会被触发,
所以在这里setImmediate延迟执行1和 延迟执行2是属于用一轮的。
setImmediate里面的嵌套是属于下一轮的,并且process.nextTick()优先级高于setImmediate,所以强势输出先输出。
欢迎讨论~
参考:http://www.ruanyifeng.com/blog/2014/10/event-loop.html