嵌套异步javascript(微任务和宏任务队列)

问题描述 投票:0回答:0

最近我遇到了以下问题:

console.log("start");

const promise1 = Promise.resolve().then(() => {
  console.log("promise1");
  const timer2 = setTimeout(() => {
    console.log("timer2");
  }, 0);
});

const timer1 = setTimeout(() => {
  console.log("timer1");
  const promise2 = Promise.resolve().then(() => {
    console.log("promise2");
  });
}, 0);

console.log("end");

我最初的答案是

start, end, promise1, timer2, promise2, timer1
(错误的)。

我知道同步代码首先执行,然后是微任务,然后是宏任务。我还了解微任务可能出现在两个宏任务之间。我有点困惑,并没有完全意识到当我们在调用堆栈中执行

timer2
时,为什么
promise1
没有被宏任务排队。我也了解 JS 引擎在我们处理
timer1
时读取并排队
promise1
,但无法完全理解其原因。

对我来说,似乎首先读取全局声明的值。

下面是解决问题顺序的原理:

  1. 首先,执行所有微任务。 (我认为这意味着首先是所有全局微任务。)
  2. 执行一个宏任务。
  3. 所有(重新添加的)微任务都是重新任务。
  4. 执行以下宏问题。
  5. 循环重复/循环结束。

按照这个原则,似乎首先考虑的是全球价值观。我理解答案背后的逻辑,但无法找到关于“全局价值观被视为第一个陈述”是否正确的任何答案。我不确定为什么当我们处理

timer2
promise1
没有排队。我有点相信它已排队,但
timer1
的处理速度比
timer2
更快,因为它是全局声明的。
timer1
是否首先被读取并在
timer2
之前排队,因为它在全局范围内?其原因何在?我有点理解但不完全确定。

javascript promise event-loop asynchronous-javascript runtime-environment
© www.soinside.com 2019 - 2024. All rights reserved.