事件循环和承诺

时间:2020-05-26 18:06:18

标签: javascript event-loop

在控制台中的代码下运行时,输出为:

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

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

有人可以向我解释为什么在“承诺1”和“结束”之前打印“承诺2”吗?

2 个答案:

答案 0 :(得分: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,因为承诺解析是异步的。

答案 1 :(得分:0)

如前所述,您应该将console.log作为函数传递,以使其以正确的顺序运行。

由于首先显示end的原因,是因为事件循环将在检查微任务队列(有时称为作业队列)之前确保调用堆栈为空并且所有全局执行都已完成)控制台日志所在的位置,等待添加到调用堆栈中。

关于优先级(按优先级从高到低的顺序):

  • 全局执行线程
  • 微任务/作业队列
  • 任务队列

startend在全局执行线程中,因此将首先运行。然后,事件循环将从微任务队列中添加Promise 1Promise 2日志,并在所有全局执行完成后运行它们。最后,如果微任务队列为空,则事件循环将检查任务队列(在此处添加了setTimeout之类的东西)。

希望有帮助。