- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先,docs已经明确指出,在一个 I/O 周期中,setImmediate() 始终会在 setTimeout() 之前运行。困扰我的是,他们没有解释为什么它会这样工作,并且在他们的文档中的先前语句中寻找线索,以某种方式向我指出了相反的情况(应该首先调用 setTimeout() )。原因如下:
When the callback finishes, there are no more callbacks in the queue, so the event loop will see that the threshold of the soonest timer has been reached then wrap back to the timers phase to execute the timer's callback
和
Once the poll queue is empty the event loop will check for timers whose time thresholds have been reached. If one or more timers are ready, the event loop will wrap back to the timers phase to execute those timers' callbacks.
因此,事件循环在耗尽轮询队列后优先要做的第一件事似乎是检查计时器,如果超时则返回那里。所以从这个角度来看,应该首先执行 setTimeout()。
我不是高级程序员,可以阅读 github 中的源代码来了解 libuv 库内部如何工作。非常感谢你们的帮助。
最佳答案
事件循环仅顺时针移动,不会向后移动。因此,为了进入计时器阶段,事件循环必须经过执行 setImmediate 回调的检查阶段。这就是为什么在 I/O 周期中 setImmediate 将首先被调用,否则 setTimeout 将首先被调用。
关于node.js - 为什么在 I/O 回调中 setImmediate() 总是在 setTimeout() 之前运行 [NodeJS]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50213125/
我是一名优秀的程序员,十分优秀!