async function a() {
console.log("a");
}
async function b() {
console.log("b1");
await a();
console.log("b2");
}
setTimeout(() => {
console.log("setTimeout");
}, 0);
b();
new Promise((resolve) => {
console.log("p1");
resolve();
}).then(() => {
console.log("p2");
});
console.log("end");
上面的代码将会输出:
"b1"
"a"
"p1"
"end"
"b2"
"p2"
"setTimeout"
我知道第一个输出是“b1”,第二个输出是“a”,但为什么第三个输出不是“b2”?
我认为的输出是
"b1"
"a"
"b2"
"p1"
"end"
"p2"
"setTimeout"
我了解 Promise 和 setTimeout 函数的顺序,只是无法弄清楚“b2”的顺序。
为什么第三个输出不是“b2”?
首先必须运行完所有同步代码。只有在那之后才能恢复
await
之后。
此代码首先定义一些函数,然后设置超时,然后调用
b()
。 b
注销“b1”,然后调用 a
注销“a”并返回一个 Promise,然后 b
await
就是该 Promise。 await
关键字意味着b
立即返回,并返回一个promise。接下来,代码调用 new Promise
,它立即运行构造函数,记录“p1”并将 Promise 移至已解决状态。接下来,它在 Promise 上调用 .then
,将一些代码排队以供将来运行,最后它会注销“end”。
现在我们已经完成了所有同步内容,因此我们可以开始恢复异步内容,例如“b2”。