代码执行过程:
1.从上到下执行,同步代码立即执行
2.遇到宏任务丢到宏任务队列
遇到微任务丢到微任务队列
遇到async函数先执行await之前的代码
再执行await那一行的同步代码,接着跳出函数往下执行外部同步代码
3.执行完外部同步代码,回到async函数。
如果await后面执行完毕,则执行该函数内剩余的同步代码
4.扫描微任务队列
5.扫描宏任务队列
【注意点:async函数会返回一个promise】
下面做两道题:
//第一题:
console.log(1);
async function fn(){
console.log(2)
await console.log(3)
console.log(4)
}
setTimeout(()=>{
console.log(5)
},0)
fn();
new Promise((resolve)=>{
console.log(6)
resolve();
}).then(()=>{
console.log(7)
})
console.log(8)
//结果:1 2 3 6 8 4 7 5
//第二题:
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
async function async2() {
console.log('async2');
}
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0)
async1();
new Promise(function(resolve) {
console.log('promise1');
resolve();
}).then(function() {
console.log('promise2');
});
console.log('script end');
/*
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
*/