在控制台中的代码下运行时,输出为:
"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”吗?
答案 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
的原因,是因为事件循环将在检查微任务队列(有时称为作业队列)之前确保调用堆栈为空并且所有全局执行都已完成)控制台日志所在的位置,等待添加到调用堆栈中。
关于优先级(按优先级从高到低的顺序):
start
和end
在全局执行线程中,因此将首先运行。然后,事件循环将从微任务队列中添加Promise 1
和Promise 2
日志,并在所有全局执行完成后运行它们。最后,如果微任务队列为空,则事件循环将检查任务队列(在此处添加了setTimeout
之类的东西)。
希望有帮助。