Node中的定时器

Node中有四种定时器

setTimeout()
setInterval()
setImmediate()
process.nextTick()

它们之间有什么区别呢?

setTimeout(() => console.log("timeout"));
setImmediate(() => console.log("immediate"));
process.nextTick(() => console.log("process nextTick"));
console.log("normal");

分别输出

normal
process nextTick
timeout
immediate

它们的执行顺序为

同步任务 -> process.nextTick -> 微任务

process.nextTick会在本轮的循环中尾部添加任务,而setTimeoutsetImmediate回调会添加到微任务队列,微任务会被追加到process.nextTick队列的后面。

事件循环执行的流程

可以看到,setTimeout发生在timer阶段,而setImmediate发生在check阶段,所以,setTimeout会先于setImmediate执行回调。

setTimeout的第二参数默认为0,其实node是做不到精确为0毫秒的,实际执行的时候,进入事件循环以后,有可能到了1毫秒,也可能还没到1毫秒,取决于系统当时的状况。如果没到1毫秒,那么 timers 阶段就会跳过,进入 check 阶段,先执行setImmediate的回调函数。

下面的代码一定是先输出2,再输出1。这是因为先进入了 I/O callbacks 阶段,然后是 check 阶段,最后才是 timers 阶段。

const fs = require('fs');

fs.readFile('test.js', () => {
  setTimeout(() => console.log(1));
  setImmediate(() => console.log(2));
});

本文整理自:http://www.ruanyifeng.com/blog/2018/02/node-event-loop.html

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注