代码片段如下:
console.log('test')
async function async1() {
console.log('before wait');
await wait();
console.log('after wait');
}
async function wait() {
try {
return await new Promise((res, rej) => {
console.log('wait');
rej('reject');
});
} catch (reason) {
console.log(reason);
}
}
async function test() {
async1();
console.log('before resolve');
await Promise.resolve();
console.log('after resolve');
}
test();
console.log('test end');
你也可以在playground中运行代码。
实际结果:
[LOG]: "test"
[LOG]: "before wait"
[LOG]: "wait"
[LOG]: "before resolve"
[LOG]: "test end"
[LOG]: "reject"
[LOG]: "after resolve"
[LOG]: "after wait"
我以为 after wait
会先被打印出来,因为它早就被推入了微任务队列中。
我错在哪里?
我向@Seblor寻求了建议
如果你用then函数替换async/await,可能会更清晰。
然后我移除了所有的async/await。
console.log('test')
function async1() {
console.log('before wait');
return wait().then(() => {
console.log('after wait');
})
}
function wait() {
return new Promise((res, rej) => {
console.log('wait');
rej('reject');
}).catch((reason) => {
console.log(reason);
})
}
function test() {
async1();
console.log('before resolve');
Promise.resolve().then(() => {
console.log('after resolve');
})
}
test();
console.log('test end');
然后我意识到,第一个被推入微任务队列的代码是位于 catch
中的代码,其次是 console.log('after resolve')
,最后是 console.log('after wait')
test
函数中调用async1()
?你是不是想要对它进行await
操作? - Bergiawait
,而是在我的工作中遇到了一个类似的情况,所以我只是随意编写了async1
来模拟我遇到的场景。“推送到微任务队列的第一段代码是记录“reject”的代码”这让我茅塞顿开,谢谢。 - YJ Cai