某天中午午飯前易阳,11:48分贼陶,釘釘突然閃動了起來。消息如下:
代碼如下:
(function() {
setTimeout(() => {
console.log(0);
});
new Promise(resolve => {
console.log(1);
setTimeout(() => {
resolve();
Promise.resolve().then(() => console.log(2));
console.log(3);
});
Promise.resolve().then(() => console.log(4));
}).then(() => {
console.log(5);
Promise.resolve().then(() => console.log(8)); //這句是多加的
setTimeout(() => console.log(6));
});
console.log(7);
})();
那么打印順序是咋樣的呢闺金?我們來好好分析一下。
(╥╯^╰╥)emmmm,被批評了解釋的不夠簡單易懂峰档,我殘忍的刪掉了一大段解釋
這里本來有一大段關(guān)于上面那個題目的解釋
我決定了败匹,上面那題你們自己做,做對了讥巡,就請我吃一頓午飯O颇丁!I形馈9殚拧!Vㄉ妗I残埂M饫铩!L厥盅蝗!
那咱們來一個更加復(fù)雜的來分析分析
下題的打印順序是啥?
(function() {
setTimeout(() => {
console.log(0);
});
new Promise(resolve => {
console.log(1);
setTimeout(() => {
resolve();
Promise.resolve().then(() => {
console.log(2);
setTimeout(() => console.log(3));
Promise.resolve().then(() => console.log(4));
});
});
Promise.resolve().then(() => console.log(5));
}).then(() => {
console.log(6);
Promise.resolve().then(() => console.log(7));
setTimeout(() => console.log(8));
});
console.log(9);
})();
簡單版理解
- js的執(zhí)行順序姆蘸,先同步后異步
- 異步中任務(wù)隊列的執(zhí)行順序: 先微任務(wù)
microtask
隊列墩莫,再宏任務(wù)macrotask
隊列
3.調(diào)用
Promise
中的resolve
,reject
屬于微任務(wù)隊列逞敷,setTimeout
屬于宏任務(wù)隊列
解釋如下:【同步>異步狂秦;微任務(wù)>宏任務(wù)】
第一步:打印出1、9 推捐;如圖:
由圖a中的任務(wù)隊列可知:
第二步: 執(zhí)行微任務(wù)3裂问,打印出 5;
第三步:執(zhí)行宏任務(wù)1牛柒,打印出 0堪簿,
第四步:開始執(zhí)行宏任務(wù)2;如圖:
第五步:由圖b中的任務(wù)隊列可知皮壁, 執(zhí)行微任務(wù)4椭更,打印出 6,如圖:
第六步:由圖c中的任務(wù)隊列可知蛾魄, 執(zhí)行微任務(wù)5虑瀑,打印出2;如圖:
由圖d的任務(wù)隊列可知畏腕,
第七步:執(zhí)行微任務(wù)6缴川,打印出7;
第八步:執(zhí)行微任務(wù)9描馅,打印出4把夸;
第九步:執(zhí)行宏任務(wù)7,打印出8铭污;
第十步:執(zhí)行宏任務(wù)8恋日,打印出3;
所以最終結(jié)果為:
1嘹狞、9岂膳、5、0磅网、6谈截、2、7、4簸喂、8毙死、3
深入理解【參考】
https://blog.csdn.net/qingwenxiutong/article/details/52397676
后記
回到最開頭,那頓飯喻鳄,emmmmmmmmm扼倘,我并沒有吃上,當時看到這題就懵逼了除呵。如果當初的我可以找到像我這篇這么完美的文章再菊,我一定吃他個十碗飯,使無人敢再出題颜曾。
后后記
如果有幫到你纠拔,就點個小愛心吧 (?▽?)