摘要:講的很清晰,看完之后更深一步的理解了事件循環(huán)機(jī)制。簡短的概述下總結(jié)是一個宏任務(wù)源,寫在里面的回調(diào)函數(shù)會加到宏任務(wù)隊列中。至此,一輪的事件循環(huán)已經(jīng)執(zhí)行完畢,開啟新的一輪事件循環(huán)。這就是整段代碼執(zhí)行情況的理解。
這篇文章真的是好文。講的很清晰,看完之后更深一步的理解了事件循環(huán)機(jī)制。
簡短的概述下總結(jié)http://www.jianshu.com/p/12b9...
setTimeout是一個宏任務(wù)源,寫在里面的回調(diào)函數(shù)會加到宏任務(wù)隊列中。
Promise是一個微任務(wù)源,寫在里面resolve以及reject回調(diào)會被加到微任務(wù)隊列中。
事件循環(huán)可以分為這樣的一個過程:分別是 宏任務(wù)->執(zhí)行棧->微任務(wù)。
setTimeout(function() { console.log("timeout1"); }) new Promise(function(resolve) { console.log("promise1"); for(var i = 0; i < 1000; i++) { i == 99 && resolve(); } console.log("promise2"); }).then(function() { console.log("then1"); }) console.log("global1");
比如上面這樣的一段代碼,setTimeout是一個宏任務(wù)源,所以里面的回調(diào)函數(shù)console.log("timeout1");會被加到宏任務(wù)隊列中。到了Promise,輸出promise1以及promise2,等到for循環(huán)結(jié)束后,執(zhí)行resolve,由于Promise是一個微任務(wù)源,所以console.log("then1");回調(diào)會被加到微任務(wù)隊列中。繼續(xù)執(zhí)行代碼,輸出grobal1。這個時候,執(zhí)行棧上的代碼已經(jīng)執(zhí)行完畢,所以此時我們執(zhí)行微任務(wù)隊列,此時的微任務(wù)隊列上有console.log("then1");,所以瀏覽器輸出then1。至此,一輪的事件循環(huán)已經(jīng)執(zhí)行完畢,開啟新的一輪事件循環(huán)。也是從宏任務(wù)->執(zhí)行棧->微任務(wù)。由于此時宏任務(wù)上有事件console.log("timeout1");,所以輸出timeout1。這就是整段代碼執(zhí)行情況的理解。依次輸出如下:
promise1 promise2 global1 then1 timeout1
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/82243.html
摘要:的單線程,與它的用途有關(guān)。事件循環(huán)事件循環(huán)是指主線程重復(fù)從消息隊列中取消息執(zhí)行的過程。到此為止,就完成了工作線程對主線程的通知,回調(diào)函數(shù)也就得到了執(zhí)行。 一. 區(qū)分進(jìn)程和線程 很多新手是區(qū)分不清線程和進(jìn)程的,沒有關(guān)系。這很正常。先看看下面這個形象的比喻: 進(jìn)程是一個工廠,工廠有它的獨立資源-工廠之間相互獨立-線程是工廠中的工人,多個工人協(xié)作完成任務(wù)-工廠內(nèi)有一個或多個工人-工人之間共享...
摘要:如果看完本文后,還對進(jìn)程線程傻傻分不清,不清楚瀏覽器多進(jìn)程瀏覽器內(nèi)核多線程單線程運(yùn)行機(jī)制的區(qū)別。因此準(zhǔn)備梳理這塊知識點,結(jié)合已有的認(rèn)知,基于網(wǎng)上的大量參考資料,從瀏覽器多進(jìn)程到單線程,將引擎的運(yùn)行機(jī)制系統(tǒng)的梳理一遍。 前言 見解有限,如有描述不當(dāng)之處,請幫忙及時指出,如有錯誤,會及時修正。 ----------超長文+多圖預(yù)警,需要花費不少時間。---------- 如果看完本文后,還...
摘要:異步執(zhí)行機(jī)制異步執(zhí)行相對來說復(fù)雜些所以詳細(xì)描述下關(guān)鍵是在各種使用情況下執(zhí)行順序問題在此就需要引入一個概念。在達(dá)到這個下限時間后執(zhí)行和這些定時器設(shè)定的回調(diào)。執(zhí)行設(shè)定的回調(diào)。 js在哪執(zhí)行 js的執(zhí)行引擎基于v8(c++編寫),在chrome和node中都有應(yīng)用,執(zhí)行時有以下兩部分構(gòu)成 內(nèi)存堆(內(nèi)存分配) 調(diào)用棧(代碼執(zhí)行) 上述兩部分的聯(lián)系就是代碼在調(diào)用棧中執(zhí)行,執(zhí)行過程中會存取一些...
摘要:調(diào)用棧被清空,消息隊列中并無任務(wù),線程停止,事件循環(huán)結(jié)束。不確定的時間點請求返回,將設(shè)定好的回調(diào)函數(shù)放入消息隊列。調(diào)用棧執(zhí)行完畢執(zhí)行消息隊列任務(wù)。請求并發(fā)回調(diào)函數(shù)執(zhí)行順序無法確定。 異步編程 JavaScript中異步編程問題可以說是基礎(chǔ)中的重點,也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執(zhí)行的時候是從上到下按順序執(zhí)行,一段代碼執(zhí)行了之后才會執(zhí)行下一段代碼,這種方式...
閱讀 989·2023-04-26 01:47
閱讀 1674·2021-11-18 13:19
閱讀 2047·2019-08-30 15:44
閱讀 654·2019-08-30 15:44
閱讀 2299·2019-08-30 15:44
閱讀 1236·2019-08-30 14:06
閱讀 1427·2019-08-30 12:59
閱讀 1904·2019-08-29 12:49