当我在控制台中运行下面的代码时,我得到的输出是:
"start"
"Promise 2"
"end"
"Promise 1"
console.log("start");
Promise.resolve().then(
() => console.log("Promise 1")
).then(console.log("Promise 2"));
console.log("end");
谁能解释一下为什么"Promise 2“在"Promise 1”和"end“之前?
发布于 2020-05-27 02:15:06
.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,因为promise解析是异步的。
发布于 2020-05-27 02:32:28
正如所指出的,您应该将console.log作为函数传递,以使其以正确的顺序运行。
至于首先显示end的原因,是因为事件循环在检查微任务队列(有时称为作业队列)之前,会确保调用堆栈为空,并且所有全局执行都已完成。您的控制台日志正等待添加到调用堆栈中。
它是关于优先级的(按照优先级的降序):
execution
start和end位于全局执行线程中,因此将首先运行。然后,事件循环将从微任务队列添加Promise 1和Promise 2日志,并在所有全局执行完成后运行它们。最后,如果微任务队列为空,则事件循环将检查任务队列(此处添加了setTimeout之类的内容)。
希望这能有所帮助。
https://stackoverflow.com/questions/62028554
复制相似问题