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
会在本轮的循环中尾部添加任务,而setTimeout
和setImmediate
回调会添加到微任务队列,微任务会被追加到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
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=2537