如何理解process.nextTick(fn) 早于 setTimeout(fn,0) 执行

function compareFunc () {
  console.log(1);
  setTimeout(function () {
    console.log(2);
  }, 1);
  process.nextTick(function () {
    console.log(3);
  });
  setTimeout(function () {
    console.log(4);
  }, 0);
}
compareFunc();
// 执行结果:
//1
//3
//2
//4

Fppv-U2FJpIUbOcXMYMWyy6-Aj5k

这个图该怎么理解。根据这个图,timers 不是在dile观察者前面吗?

阅读 2.3k
2 个回答

nextTick属于microTask, 而setTimeout属于macroTask. 一个macroTask执行完后会插入多个microTask.

这里的macroTask不只是setTimeout, 还有主线程的运行脚本. 比如你的compareFunc函数, 运行的时候声明两个异步任务.

此时nextTick被插入主线程脚本执行之后, 在事件循环timers阶段之前, 而setTimeout则是timers阶段执行.

所以这里优先级是nextTick高于setTimeout.

刚好写了一篇 Node.js的事件循环机制的文章, 有兴趣可以读一读. 有阅读疑问都可以提出来.
理解事件循环机制

牵扯到了js的单线程运行机制,因为机制规定的原因,所以简单粗暴的理解为:
1、setTimeout和setInterval在指定的运行时间到了后会查看本轮event loop是否执行完毕;
2、如果完毕就执行其中的回调,没有则会被移出本轮event loop放到下一轮进行判断,而process.nextTick与promise则会在本轮event loop结束后立即执行;
3、所以setTimeout代码书写在前面或者后面并不会对process.nextTick的执行产生影响,因为他就是优先级最低的(个人理解);

如果对其中的原因感兴趣可以去网上查阅js运行机制和event loop的相关资料

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