事件循环是 Node.js 中管理异步回调的重要机制,使平台能够执行非阻塞 I/O 操作。下面详细分解了事件循环运作的6个关键点。
- 调用堆栈
- 回拨注册
- 回调队列
- 持续监控
- 异步操作完成
- 执行流程
1。调用堆栈:了解 JavaScript 中的调用堆栈:
- 调用堆栈是执行 JavaScript 代码的地方。当一个函数被调用时,它被压入调用栈。一旦函数执行完成,它就会从堆栈中弹出。
- 如果调用堆栈正忙于执行函数,则事件循环会等到堆栈为空后再检查回调队列。
2。回调注册:如何处理异步操作:
- Web API 和 Node.js API:当发起异步操作(如文件读取、网络请求或计时器)时,相应的回调将注册到 Web API(在浏览器中)或 Node.js API (在服务器中)。
- 示例:
- 对于setTimeout(),当定时器到期时,回调
函数注册到要执行的事件循环中
在宏任务队列中。
- 对于通过http.get()发出的网络请求,当数据
收到后,回调被放入队列中
正在处理。
3。回调队列:宏任务与微任务:
Node.js 维护两种主要类型的回调队列
- 宏任务队列(任务队列):该队列处理来自setTimeout、setInterval、I/O操作和其他需要时间的任务等操作的回调。该队列中的任务仅在所有微任务处理完毕且调用堆栈为空后才会执行。
- 微任务队列:该队列包括来自 Promises 和 process.nextTick() 的回调。微任务具有更高的优先级,并且在处理任何宏任务之前,调用堆栈为空后立即执行。
4。通过事件循环进行连续监控:
- 事件循环不断检查调用堆栈和回调队列以确定是否有任何任务需要执行。这使得 Node.js 能够同时处理多个异步操作,而不会阻塞主线程。
5。异步操作完成:
一旦异步操作完成,相应的回调函数就会添加到相应的队列中:
- 如果 setTimeout() 设置的计时器到期,则关联的回调会注册到宏任务队列中,等待当前堆栈和任何微任务处理完毕后执行。
6。执行流程:将任务移回调用堆栈:
- 当调用堆栈为空时,事件循环首先处理微任务队列中的所有任务。这可以确保尽快处理承诺决议和其他微任务。
- 所有微任务完成后,事件循环将移至宏任务队列并一次执行一个任务。此任务执行将继续,直到堆栈再次为空,此时循环再次检查队列。
- 任务执行后,就会从调用堆栈中删除
事件循环执行示例:
console.log('Start');
setTimeout(() => {
console.log('Timeout');
}, 0);
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('End');
登录后复制
输出:
Start
End
Promise
Timeout
登录后复制
在此示例中:
- 同步日志(“Start”和“End”)首先执行,并将它们添加到调用堆栈中。
- setTimeout 回调注册在宏任务队列中。
- Promise 解析,将其回调添加到微任务队列中。
- 清除调用堆栈后,事件循环会处理微任务队列(“Promise”),然后再处理宏任务队列(“Timeout”)。
事件循环是 Node.js 的核心功能,可实现异步操作的高效管理。通过持续监控调用堆栈和回调队列,确保任务以非阻塞方式处理。 Web API 和 Node.js API 中回调的注册是维持应用程序响应能力的关键,使 Node.js 能够有效地处理大量并发操作。
以上是Node.js 事件循环的标签的详细内容。更多信息请关注PHP中文网其他相关文章!