我发现事件循环通常在每次迭代中逐步完成以下循环:定时器 - > I / O回调 - >空闲 - >民意调查 - >检查 - >关 根据官方Node.js文档https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/。
现在它还说'I / O Callbacks'阶段执行一些系统操作的回调,例如TCP错误的类型'例如TCP连接错误等典型操作。
并在'民意调查中阶段 - 它说'检索新的I / O事件' 。像传入的连接,数据等
我很困惑。在哪个阶段是I / O事件(回调处理程序),例如“接收到的新HTTP请求”,“按照先前的查询从数据库接收的数据”'被执行了吗?
答案 0 :(得分:1)
通常,您不应该关心这些阶段。甚至微任务(如nextTick)和macrotask(如setImmediate)之间的区别对于每天NodeJS开发人员来说都不是很重要。那篇文章深入探讨了Node如何在内部处理事物。
用户通常需要关心的是,当他们注册请求时 - 他们提供的回调最终将在以后的某个时间调用,这是通常足够快,只要它们不通过在Node进程上执行大量同步CPU绑定工作来“阻止事件循环”。
在哪个阶段是I / O事件(回调处理程序),比如'接收到新的HTTP请求','从先前的查询中从数据库接收的数据'?
它们在民意调查阶段执行:
如果轮询队列不为空,则事件循环将遍历其同步执行它们的回调队列,直到队列耗尽或达到系统相关的硬限制。
请注意,轮询阶段不是唯一可以执行I / O回调的地方。 (有点名不清楚)I/O callbacks
阶段也负责一些回调。这是由于libuv的工作原理,并且在代码中应该是透明的。此外 - 一些库(如DB库)可以自己进行调度并在定时器内运行回调代码(在定时器阶段) - 并且一些异步回调(如关闭回调)在它们自己的阶段运行。
答案 1 :(得分:-1)
没有什么可以混淆的。所有异步回调都在回调阶段执行。它是解释器执行javascript的唯一两个地方之一:脚本启动时和回调阶段。