Node中的定时器

该文章由 leevare 发布于 ,归类于 Javascript

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

如果觉得我的文章对您有用,请您随意打赏。您的支持将鼓励我更加努力创作!

相关文章:

订阅
提醒
guest
0 评论
Inline Feedbacks
View all comments