首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件循环和承诺

事件循环和承诺
EN

Stack Overflow用户
提问于 2020-05-27 02:06:19
回答 2查看 45关注 0票数 3

当我在控制台中运行下面的代码时,我得到的输出是:

代码语言:javascript
复制
"start"
"Promise 2"
"end"
"Promise 1"

代码语言:javascript
复制
console.log("start");
Promise.resolve().then(
  () => console.log("Promise 1")
).then(console.log("Promise 2"));
console.log("end");

谁能解释一下为什么"Promise 2“在"Promise 1”和"end“之前?

EN

回答 2

Stack Overflow用户

发布于 2020-05-27 02:15:06

.then()的参数应该是一个函数。但是你写了.then(console.log("Promise 2"))console.log("Promise 2")是一个函数调用,而不是一个函数。它会立即执行,因此日志消息会立即显示,而不是在承诺解析时显示。

将其更改为函数,就像您在console.log("Promise 1")中所做的那样,它们将按预期的顺序执行。

代码语言:javascript
复制
console.log("start");
Promise.resolve().then(
  () => console.log("Promise 1")
).then(() => console.log("Promise 2"));
console.log("end");

首先记录end,因为promise解析是异步的。

票数 4
EN

Stack Overflow用户

发布于 2020-05-27 02:32:28

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

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

它是关于优先级的(按照优先级的降序):

execution

  • Micro-task/job queue的
  • 全局线程
  • 任务队列

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

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62028554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档