事件循环和承诺

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

当我在控制台中运行下面的代码时,我得到的输出是:"Promise 1 "和 "end"。

"start"
"Promise 2"
"end"
"Promise 1"

console.log("start");
Promise.resolve().then(
  () => console.log("Promise 1")
).then(console.log("Promise 2"));
console.log("end");

谁能给我解释一下为什么 "承诺2 "被打印在 "承诺1 "和 "结束 "之前?

javascript event-loop
1个回答
4
投票

的参数 .then() 应该是一个函数。但你写道 .then(console.log("Promise 2"))console.log("Promise 2") 是一个函数调用,而不是一个函数。它是立即执行的,所以日志信息是立即显示的,而不是在解决承诺的时候。

把它改成一个函数,就像你周围的 console.log("Promise 1"),它们将按照预期的顺序执行。

console.log("start");
Promise.resolve().then(
  () => console.log("Promise 1")
).then(() => console.log("Promise 2"));
console.log("end");

end 因为承诺的解析是异步的,所以首先被记录下来。


0
投票

如前所述,你应该将 console.log 作为一个函数,让它以正确的顺序运行。

至于为什么要用 end 首先显示,这是因为事件循环将确保调用堆栈是空的,并且所有的全局执行都已完成,然后才会检查微任务队列(有时也称为作业队列),你的控制台日志就放在那里,等待被添加到调用堆栈中。

这是关于优先级(按优先级降序排列)。

  • 全局执行线程
  • 微型任务队列
  • 任务队列

startend 是在执行的全局线程中,所以将首先运行。然后,事件循环将添加 Promise 1Promise 2 日志,并在所有全局执行结束后运行它们。最后,如果微任务队列是空的,事件循环将检查任务队列(如 setTimeout 在这里得到补充)。)

希望能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.