Node 中的 Event Loop

109 阅读1分钟

Node 中的 Event Loop

最新的(11 以后)node版本中的事件环和浏览器差不多,执行一个宏任务然后清空微任务nextTick,但对宏任务进行了分层,当event loop执行到某个阶段时会将当前阶段对应的队列依次执行。当该队列已用尽或达到回调限制,事件循环将移动到下一阶段。

  1. 主栈的代码执行完毕以后会清空微任务nextTick优先于promise.then),

  2. 进入到事件环当中轮询(每执行一个宏任务会清空微任务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