关于nextTick的一点疑问
发布于 2 年前 作者 yinlubin2014 1975 次浏览 来自 问答
//加入两个setImmediate()回调函数
setImmediate(function(){
    console.log("setImmediate延迟执行1");
    process.nextTick(function(){
        console.log("强势插入");
    });
});
setImmediate(function(){
    console.log("setImmediate延迟执行2");
});

为什么执行结果是: setImmediate延迟执行1 setImmediate延迟执行2 强势插入

但是我理解process.nextTick 不是会放到任务队列前面吗? 所以应该是

setImmediate延迟执行1 强势插入 setImmediate延迟执行2

才对

6 回复
setImmediate(function(){
  console.log("setImmediate延迟执行1");
  setImmediate(function(){
    console.log("setImmediate延迟执行2");
  });
  process.nextTick(function(){
      console.log("强势插入");
  });
});

异步是容易造成逻辑混乱。上面是你想表达的代码。官方文档建议不要用 process.nextTick。doc

We recommend developers use setImmediate() in all cases because it’s easier to reason about (and it leads to code that’s compatible with a wider variety of environments, like browser JS.)

@ianchn 我知道,但是我只是想知道为什么nextTick没有在 延迟执行2之前执行

@ianchn 这个好像 我问你为什么无糖可乐也会很甜,但是你回答喝可乐也杀精不如去喝茶。

node的机制是执行完宏任务后会去清掉微任务队列里注册的任务,一个function的执行可以看成一个宏任务,setImmediate,setTimeout这些也可以看成宏队列,promise.then与nextTick是微队列,先执行function,把两个setInmediate推入队列,执行第一个时发现nextTick,推入微队列,执行第二个,执行nextTick

回到顶部