• 异步任务是不会立即执行的事件任务。异步任务包括宏任务和微任务。


事件循环(Event Loop)是处理非阻塞异步操作的核心机制。事件循环主要由多个阶段组成,每个阶段负责处理不同类型的任务。以下是一个典型的事件循环包含的主要阶段:
简介:单线程还是使用方而言,内部io、网络还是多线程的
┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘
setTimeout和setInterval。fs.readFile、net.Server上的连接事件等。setImmediate回调被调用。setImmediate不同于setTimeout,因为它是在当前事件循环的I/O回调之后,进入下一次事件循环之前执行。此外,还有两个特殊的阶段:
async资源,如http.ServerRequest。setImmediate回调。finalization钩子。除了上述阶段之外,还存在微任务(Microtasks)的概念。微任务包括:
process.nextTick回调.then()和.catch()方法中的回调MutationObserver(不适用于Node.js)QueueMicrotask()一个 Node.js 程序结束时,Node.js 会检查 event loop 是否在等待异步 I/O 操作结束,是否在等待计时器触发,如果没有,就会关掉 event loop。
微任务是在当前宏任务结束后立即执行的,但在控制权传递给下一个宏任务之前。这意味着微任务具有比大多数宏任务更高的优先级。