Promise、async/await、setTimeout的优先级

问题描述 投票:0回答:1
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”的顺序。

javascript async-await promise settimeout
1个回答
1
投票

为什么第三个输出不是“b2”?

首先必须运行完所有同步代码。只有在那之后才能恢复

await
之后。

此代码首先定义一些函数,然后设置超时,然后调用

b()
b
注销“b1”,然后调用
a
注销“a”并返回一个 Promise,然后
b
await
就是该 Promise。
await
关键字意味着
b
立即返回,并返回一个promise。接下来,代码调用
new Promise
,它立即运行构造函数,记录“p1”并将 Promise 移至已解决状态。接下来,它在 Promise 上调用
.then
,将一些代码排队以供将来运行,最后它会注销“end”。

现在我们已经完成了所有同步内容,因此我们可以开始恢复异步内容,例如“b2”。

© www.soinside.com 2019 - 2024. All rights reserved.