Node 中的 Event Loop
最新的(11 以后)node版本中的事件环和浏览器差不多,执行一个宏任务然后清空微任务和nextTick,但对宏任务进行了分层,当event loop执行到某个阶段时会将当前阶段对应的队列依次执行。当该队列已用尽或达到回调限制,事件循环将移动到下一阶段。
-
主栈的代码执行完毕以后会清空
微任务(nextTick优先于promise.then), -
进入到事件环当中轮询(每执行一个宏任务会清空
微任务和nextTick)
┌───────────────────────────┐
┌─>│ timers │
│ └─────────────┬─────────────┘
| 执行延迟到下一个循环迭代的 I/O 回调。
│ ┌─────────────┴─────────────┐
│ │ pending callbacks │
│ └─────────────┬─────────────┘
| 仅系统内部使用。
│ ┌─────────────┴─────────────┐
│ │ idle, prepare │
│ └─────────────┬─────────────┘
| 检索新的I/O事件;执行与 I/O相关的回调 ┌───────────────┐
│ ┌─────────────┴─────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └─────────────┬─────────────┘ │ data, etc. │
│ setImmediate() 回调函数在这里执行。 └───────────────┘
│ ┌─────────────┴─────────────┐
│ │ check │
│ └─────────────┬─────────────┘
| 一些关闭的回调函数
│ ┌─────────────┴─────────────┐
└──┤ close callbacks │
└───────────────────────────┘
const fs = require("fs");
fs.readFile("./note.md", "utf8", () => {
//poll的回调函数,执行完毕后会先清空setImmediate
setTimeout(() => {
console.log(5);
});
setImmediate(() => {
console.log(3);
});
setImmediate(() => {
console.log(4);
});
});
\
setTimeout(() => {
console.log(1);
}, 0);
setImmediate(() => {
console.log(2);
});
//1 2 3 4 5