gpt4 book ai didi

javascript - JS事件循环混淆

转载 作者:行者123 更新时间:2023-11-30 08:22:02 25 4
gpt4 key购买 nike

我是 JS 事件循环的新手,我想知道是否有人可以简要介绍一下 js 引擎如何运行它:

function start(){
setTimeout(function(){
console.log("Timeout")
}, 0)
setImmediate(function(){
console.log("Immediate")
})
process.nextTick(function(){
console.log("next tick")
})
}

结果是:

next tick
Timeout
Immediate

我以为当 JS 引擎运行这个时,

  1. 它解析脚本,设置 Timer,设置 Immediate,设置 nextTick 队列,然后进入 POLL 阶段,检查那里是否有任何队列(在这种情况下没有)
  2. 在进入 CHECK 阶段之前,它运行 nextTick 队列,打印“next tick”。
  3. 进入 CHECK 阶段,运行立即队列,打印“立即”
  4. 循环回到TIMER阶段,打印“Timeout”

我的困惑是为什么 setTimeout 在 Immediate 之前打印出来?

附言,

我把Timeout delay从0设置到3或者更多之后,那么顺序就是:

next tick
Immediate
Timeout

但这仍然不能解释为什么之前的订单 JS 事件循环会运行。

我想知道我是否遗漏了什么?

最佳答案

setImmediate 将函数排在事件队列中已有的任何 I/O、事件、回调之后。所以,在这种情况下,setTimeout 已经在队列中。

我认为你应该阅读 https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/再次。它可以回答您所有的问题。我引用上述文件中的以下几行

setImmediate() 与 setTimeout()

setImmediatesetTimeout() 相似,但根据调用时间的不同表现不同。

setImmediate() 旨在在当前轮询阶段完成后执行脚本。setTimeout() 安排脚本在经过最小阈值(以毫秒为单位)后运行。

计时器的执行顺序将根据调用它们的上下文而有所不同。

了解 process.nextTick()

process.nextTick() 在技术上不是事件循环的一部分。相反,nextTickQueue 将在当前操作完成后处理,而不管事件循环的当前阶段如何。

回顾我们的图表,任何时候您在给定阶段调用 process.nextTick(),传递给 process.nextTick() 的所有回调都将在之前得到解决事件循环继续。这可能会造成一些糟糕的情况,因为它允许您通过递归 process.nextTick() 调用“饿死”您的 I/O,从而阻止事件循环到达轮询阶段。

关于javascript - JS事件循环混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51953351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com