我被 node 的以下段落弄糊涂了.js文档.

setImmediate() vs setTimeout()

... 计时器的执行顺序将根据调用它们的上下文而有所不同.如果两者都是从主模块内调用的,那么时间将受到进程性能的限制(这可能会受到机器上运行的其他应用程序的影响).

例如,如果我们运行以下不在输入/输出周期内的脚本(即主模块),则两个计时器的执行顺序是不确定的,因为它受进程性能的约束:

接下来显示以下示例

// timeout_vs_immediate.js
setTimeout(() => {
  console.log('timeout');
}, 0);

setImmediate(() => {
  console.log('immediate');
});
$ node timeout_vs_immediate.js
timeout
immediate

$ node timeout_vs_immediate.js
immediate
timeout

我不明白是什么使结果不确定.既然timers阶段发生在check阶段之前,那么setTimeout调度的回调不应该总是在setImmediate调度的回调之前执行吗?我认为事件循环中的阶段顺序不会因为上下文切换或其他原因而改变.

该文件还指出

但是,如果在一个输入/输出周期内移动两个调用,则立即回调始终首先执行:

好的,但是什么使所谓的"输入/输出周期"与主模块不同呢?


我知道有很多相关的问题,但所有的答案都只是通过引用文献来陈述这个事实,而没有解释非决定论在哪里起作用,所以我不认为这是一个重复.

推荐答案

实际技巧是在Timeout constructor中,由setTimeout调用,并且在1到1以下增加倍.因此,setTimeout(fn, 0)实际上等于setTimeout(fn, 1).

libuv initializes时,它在更新其内部时钟后以计时器开始,当一毫秒已经过go 时,它将在继续进行轮询阶段(后面是setImmediate阶段)之前拾取计时器.


另一个有趣的观察结果是,在SetImmediate之后and之前也可能运行多个计时器:

setTimeout(() => console.log('timer'), 1);
setTimeout(() => console.log('timer'), 1);
setImmediate(() => console.log('immediate'));
// can produce:
// timer
// immediate
// timer

这是因为setTimeout在内部调用getLibuvNow,这将调用env->GetNow(),这不仅得到libuv的当前时间,而且得到also updates it.因此,计时器可能被放入具有不同到期时间的计时器队列中,因此计时器阶段将只拾取其中的一些.

好的,但是什么使所谓的"输入/输出周期"与主模块不同呢?

主模块在libuv初始化之前运行,而大多数其他代码将在libuv looppoll阶段运行.因此,主模块初始化之后是计时器阶段,而轮询阶段之后是"判断句柄"阶段,其中运行setImmediate次回调.因此,通常在主模块中,计时器会在即时消息(如果它们到期)之前运行,如果在回调中调度,即时消息会在计时器之前运行.

Javascript相关问答推荐

如何使用合并排序方法编写数组排序Polyfill

详细更改参考价值:"

如何使用CSS和JavaScript创建粘性、凝聚力的形状到形状(容器)变形?

Mongodb拥有5亿个文档,我想根据JavaScript驱动程序中的两个字段使用regEx进行搜索,而不是模式

我不知道为什么我的JavaScript没有验证我的表单

React Code不在装载上渲染数据,但在渲染上工作

将2D数组转换为图形

在react js中使用react—router—dom中的Link组件,分配的右侧不能被 destruct ''

切换时排序对象数组,切换不起作用

显示图—如何在图例项上添加删除线效果?

无法从NextJS组件传递函数作为参数'

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

如何在输入元素中附加一个属性为checkbox?

将核心模块导入另一个组件模块时存在多个主题

当id匹配时对属性值求和并使用JavaScript返回结果

更改预请求脚本中重用的JSON主体变量- Postman

如何使用JavaScript拆分带空格的单词

用JS从平面文件构建树形 struct 的JSON

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

用于部分字符串的JavaScript数组搜索