CNode

关于nextTick的一点疑问

问答
Yyinlubin2014发布于9 年前最后回复9 年前6 回复4023 浏览0 收藏
//加入两个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)

I
ianchn#1·9 年前
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.)

Y
yinlubin2014#3·9 年前
引用 ianchn异步是容易造成逻辑混乱。上面是你想表达的代码。官方文档建议不要用 process.nextTick。doc We recommend developers use setImmediate()...

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

F
fightAndLearn#5·9 年前

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

参与回复
登录后即可参与回复。登录