node.js的setImmediate的执行时间与机制

function con(){
    console.log(arguments[0])
}
process.nextTick(function A(){
    con(1);
    setImmediate(function(){
        con("imemediate1")
    })
 })
setTimeout(function(){
    con("timeOut")
},0)
setImmediate(function(){
    con("imemediate2")
})
setImmediate(function(){
    con("imemediate3")
})

输出结果是
image.png
setImmediate的执行是在下一次event-loop之前执行,那为什么3个setImediate的输出顺序是2->3->1,求详细解答

阅读 2.4k
2 个回答

process.nextTick 是执行完所有同步任务,再执行其中内容;
setTimeout,setImmediate 恰巧又不是同步任务(或者说优先级不够 process.nextTick 高),
所以会先执行 process.nextTick 中的 function A, 所以最先输出的是 1,然后把 immediate1 放入宏队列
然后开始执行宏任务队列
由于 setTimeout 的优先级高于 setIImmediate 所以先输出 timeOut,
然后继续队列,输出 immediate2,输出 immediate3,
最后是队列最后的 immediate1

宏任务: script, setTimeout, setInterval, setImmediate, I/O, UI rendering;
微任务: process.nextTick, Promise, Object.observe, MutationObserver;

其它的demo
setImmediate(function () {
  console.log(1);
}, 0);
setTimeout(function () {
  console.log(2);
}, 0);
new Promise(function (resolve) {
  console.log(3);
  resolve();
  console.log(4);
}).then(function () {
  console.log(5);
});
console.log(6);
process.nextTick(function () {
  console.log(7);
});
console.log(8);
//输出结果是3 4 6 8 7 5 2 1
// 加入两个nextTick的回调函数
process.nextTick(function () {
  console.log('nextTick延迟执行1');
});
process.nextTick(function () {
  console.log('nextTick延迟执行2');
});
// 加入两个setImmediate()的回调函数
setImmediate(function () {
  console.log('setImmediate延迟执行1');
  // 进入下次循环 
  process.nextTick(function () {
    console.log('强势插入');
  });
});
setImmediate(function () {
  console.log('setImmediate延迟执行2');
});

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

因為 immediate1 是屬於下一次事件循環的宏任務, immediate2immediate3 是當前事件循環的宏任務。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题