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,求详细解答

阅读 101
评论 5月23日提问
    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 是當前事件循環的宏任務。

      评论 赞赏
        撰写回答

        登录后参与交流、获取后续更新提醒