1.先看到底是宏任务还是微任务,setTimeout是宏任务,Promise和async是微任务,微任务先执行,所以先会直接fn()方法,然后输出1,然后输出2,遇到await,后面的东西会丢到宏任务中,所以会执行下面的Prmoise,输出8和9然后遇到reslove,后面的丢入宏任务,如果没有reslove,则后面的then方法不会执行,然后最后执行14
2.第一轮的微任务执行完结果为 1 2 8 9 14 ,开始继续执行,再次进入fn()方法输出3,遇到await,后面的放入宏任务,然后执行Promise的then方法,一次输出10,11,12
3.然后再次执行最后的.then方法输出 4 13 ,剩下的setTimeout最后执行,因为第二个时间为1000毫秒所以先执行,输出6 7 ,最后输出5
async function fn() {
console.log(1);
await console.log(2);
await console.log(3);
console.log(4)
}
setTimeout(() => {
console.log(5);
}, 2000)
setTimeout(() => {
new Promise(resolve => {
console.log(6);
resolve()
}).then(() => {
console.log(7)
})
}, 1000)
fn()
new Promise(resolve => {
console.log(8);
new Promise(resolve => {
console.log(9);
resolve()
}).then(() => {
console.log(10);
})
resolve()
}).then(() => {
console.log(11);
new Promise(resolve => {
console.log(12);
resolve()
}).then(() => {
console.log(13);
})
})
console.log(14)