以下代码的输出顺序是什么(事件循环综合题)?
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
async function async2() {
console.log('async2');
}
console.log('script start');
setTimeout(() => console.log('setTimeout'), 0);
async1();
new Promise(resolve => {
console.log('promise1');
resolve();
}).then(() => console.log('promise2'));
console.log('script end');
请问输出顺序是什么?
回答
孤独的心
输出:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
解析:
script start— 同步代码async1()执行:async1 start— 同步await async2()— 调用async2(),输出async2,返回 Promiseawait让出线程,后续代码注册为微任务
- Promise 构造函数是同步的,输出
promise1,resolve()触发,.then()注册为微任务 script end— 同步代码,同步任务完成- 清空微任务队列:
async1 end(await 后面的代码作为微任务执行)promise2
- 执行下一个宏任务:
setTimeout回调,输出setTimeout
关键:await 后面的代码相当于 .then() 回调,属于微任务。