我正在通过 Node docs对于事件循环,我感到非常困惑。 它说——
timers: this phase executes callbacks scheduled by setTimeout() and
setInterval().
I/O callbacks: executes almost all callbacks with the exception of close callbacks, the ones scheduled by timers, and setImmediate().
idle, prepare: only used internally.
poll: retrieve new I/O events; node will block here when appropriate.
check: setImmediate() callbacks are invoked here.
close callbacks: e.g. socket.on('close', ...).
然后在详细的轮询阶段,他们说它执行用定时器调度的定时器,还处理轮询队列中的 i/o 事件。我的困惑是我们已经为这些回调提供了计时器阶段和 i/o 回调阶段,那么轮询阶段完成的工作是什么。它还说线程可能会在轮询阶段休眠,但我没有正确理解它。
我的问题是-
- 当我们已经有定时器和 i/o 回调阶段时,为什么 poll 阶段要执行定时器和 i/o 的脚本?
- 是不是poll阶段代表timer和i/o callback阶段执行回调,而timer和callback阶段只用于内部处理没有回调在这个阶段执行?
- 我们可以在这个循环中的什么地方放置 promise ?早些时候我认为 promises 可以简单地视为回调,我们可以将它们视为回调,但在 this 中视频中,他说 promises 进入内部事件循环,但没有详细讲。
此时我很困惑。任何帮助将不胜感激。
最佳答案
poll
阶段归结为异步 I/O 等待。 Libuv 将根据操作系统使用不同的 API,但它们通常都具有相同的模式。我要使用 select()
举个例子。
poll
基本上是这样的系统调用:
select(maxNumberOfIO, readableIOList, writableIOList, errorIOList, timeout);
这个功能 block 。如果未指定 timeout
值,它将永远阻止。
结果是只要没有 I/O 事件,node.js 将无法执行任何 javascript。这显然使得无法执行基于时间的回调,例如 setTimeout()
或 setInterval()
。
因此, Node 在调用此类函数之前需要做的是计算将什么值作为timeout
传递。它通常通过遍历所有计时器的列表并计算出它可以等待 I/O 的最短时间(下一个最近的计时器)并将其用作超时值来完成此操作。它基本上处理所有计时器但不执行它们的回调,它计算等待时间。
关于javascript - NodeJS 事件循环中的轮询阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46485392/