异步任务的队列优先级: 异步宏任务先执行 然后在执行异步微任务
脚本运行 执行第一个宏任务:
1. 先执行同步任务
2.添加新的宏任务到队列中 添加新的的异步微任务
3.执行异步微任务
!!!注意是先执行的宏任务,再执行的微任务!!!
then是微任务,settimeout是宏任务(目前接触的)
为什么说是一个循环呢?
因为在开启一个宏任务的同时,往往也开启了多个宏任务,以及微任务,先执行同步任务,然后宏任务排队,执行微任务,这个宏任务做完之后,就轮到下一个宏任务,然后依次执行同步任务,添加宏任务,执行微任务,有再返回到下一个宏任务,这样就形成了一个循环,一直到最后一行代码。
(全局)同步——宏——微——(下一个)宏——同——微——(下下个)宏————.......直到不在开启新的宏任务,也就是最后一个宏任务
练习题:
setTimeout(() => {
console.log(0);
});
new Promise(resolve => {
console.log(1);
setTimeout(() => {
resolve();
var p1=new Promise((n1,n2)=>{n1(20)})
p1.then(() => console.log(2));
console.log(3);
setTimeout(()=>{console.log(9)},0)
});
new Promise((n1,n2)=>{n1(20)}).then(() => console.log(4));
}).then(() => {
console.log(5);
var p2=new Promise((n1,n2)=>{n1(20)})
p2.then(() => console.log(8));
setTimeout(() => console.log(6));
});
console.log(7);
//1,7,4,0,3,5,2,8,9,6