徹底搞懂JS事件中的循環(huán)機制 Event Loop

來源 |?https://www.cnblogs.com/tangjianqiang/p/13470363.html
一、同步和異步
二、時間循環(huán)(Event Loop)

console.log('開始111');setTimeout(function() {console.log('setTimeout111');}, 0);Promise.resolve().then(function() {console.log('promise111');}).then(function() {console.log('promise222');});console.log('開始222');
中途的三個異步,進入到了異步隊列,等待同步執(zhí)行完(打印完),返回來再執(zhí)行異步,所以是后打印出來。
打印的結(jié)果先放一放,我們稍后回來再說。現(xiàn)在我們中途插播一段知識點:
三、宏觀任務(wù)和微觀任務(wù)(先執(zhí)行微觀任務(wù),再執(zhí)行宏觀任務(wù)):
console.log('開始111');setTimeout(function() {console.log('setTimeout111');}, 0);Promise.resolve().then(function() {console.log('promise111');}).then(function() {console.log('promise222');});console.log('開始222');
2、遇到異步 setTimeout ,先放到隊列中等待執(zhí)行。
3、遇到了 Promise ,放到等待隊列中。
4、遇到同步任務(wù),直接打印 “開始222”。
5、同步執(zhí)行完,返回執(zhí)行隊列中的代碼,從上往下執(zhí)行,發(fā)現(xiàn)有宏觀任務(wù) setTimeout 和微觀任務(wù) Promise ,那么先執(zhí)行微觀任務(wù),再執(zhí)行宏觀任務(wù)。
console.log('開始111');setTimeout(function () {console.log('timeout111');});new Promise(resolve => {console.log('promise111');resolve();setTimeout(() => console.log('timeout222'));}).then(function () {console.log('promise222')})console.log('開始222');
2、遇到setTimeout異步,放入隊列,等待執(zhí)行 。
3、中途遇到Promise函數(shù),函數(shù)直接執(zhí)行,打印 “promise111”。
4、遇到setTimeout ,屬于異步,放入隊列,等待執(zhí)行。
5、遇到Promise的then等待成功返回,異步,放入隊列。
6、遇到同步,打印 “開始222”。
7、執(zhí)行完,返回,將異步隊列中的代碼,按順序執(zhí)行。有一個微觀任務(wù),then后的,所以打印 “promise222”,再執(zhí)行兩個宏觀任務(wù) “timeout111” “timeout222”。

評論
圖片
表情
