成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

js運(yùn)行機(jī)制及異步編程(二)

skinner / 1105人閱讀

摘要:的執(zhí)行機(jī)制就是一個(gè)主線(xiàn)程一個(gè)任務(wù)隊(duì)列。同步任務(wù)就是放在主線(xiàn)程上執(zhí)行的任務(wù),異步任務(wù)就是放在任務(wù)隊(duì)列的任務(wù)。和上述運(yùn)行的機(jī)制主要說(shuō)明的是,而的出現(xiàn)及普及,又有了新的概念,,它的出現(xiàn),進(jìn)一步,中分為兩種任務(wù)類(lèi)型和,在中,稱(chēng)為,可稱(chēng)為。

上一篇文章主要整理了一下js引擎是如何工作的,這篇文章主要整理js的事件循環(huán)Event loop,以及異步編程的原理
事件循環(huán)Event loop

之前文章中有講到j(luò)s是單線(xiàn)程的,而瀏覽器渲染內(nèi)核包含多個(gè)線(xiàn)程的,和js代碼部分相關(guān)的線(xiàn)程有如下幾個(gè):

js引擎線(xiàn)程

處理ajax請(qǐng)求的線(xiàn)程,

處理DOM事件的線(xiàn)程,

定時(shí)器,

讀寫(xiě)文件的線(xiàn)程(Node.JS)等

因?yàn)镴S是單線(xiàn)程的,這是從JS引擎的角度來(lái)看的,所謂的單線(xiàn)程就是指在JS引擎中負(fù)責(zé)解釋和執(zhí)行JS代碼的線(xiàn)程只有一個(gè):主線(xiàn)程。

js分為同步任務(wù)和異步任務(wù),同步任務(wù)都在主線(xiàn)程上執(zhí)行,就形成一個(gè)執(zhí)行棧,主線(xiàn)程之外,事件觸發(fā)線(xiàn)程管理著一個(gè)任務(wù)隊(duì)列,只要異步任務(wù)有了運(yùn)行結(jié)果,就在任務(wù)隊(duì)列中放置一個(gè)事件。一旦執(zhí)行棧中所有的同步任務(wù)執(zhí)行完畢(此時(shí)js引擎空閑),系統(tǒng)就會(huì)讀取任務(wù)隊(duì)列,將可運(yùn)行的異步任務(wù)添加到可執(zhí)行棧中,開(kāi)始執(zhí)行。

JS的執(zhí)行機(jī)制就是一個(gè)主線(xiàn)程 + 一個(gè)任務(wù)隊(duì)列。同步任務(wù)就是放在主線(xiàn)程上執(zhí)行的任務(wù),異步任務(wù)就是放在任務(wù)隊(duì)列的任務(wù)。所有的同步任務(wù)都在主線(xiàn)程執(zhí)行,這構(gòu)成了一個(gè)執(zhí)行棧,異步任務(wù)有了運(yùn)行結(jié)果會(huì)在任務(wù)隊(duì)列中放置一個(gè)事件,比如定時(shí)2秒,到2秒后才能放進(jìn)任務(wù)隊(duì)列(callback放進(jìn)任務(wù)隊(duì)列,而不是setTimeout函數(shù)放進(jìn)隊(duì)列)。

事件循環(huán)(Event Loop)—— 腳本運(yùn)行時(shí),先依次運(yùn)行執(zhí)行棧,然后從隊(duì)列中提取事件來(lái)運(yùn)行任務(wù)隊(duì)列中的任務(wù),這個(gè)過(guò)程是不斷重復(fù)的。所以叫事件循環(huán)(Event Loop)。

macrotask和microtask

上述js運(yùn)行的機(jī)制主要說(shuō)明的是es5,而es6的出現(xiàn)及普及,又有了新的概念,promise,它的出現(xiàn),進(jìn)一步,JS中分為兩種任務(wù)類(lèi)型:macrotask和microtask,在ECMAScript中,microtask稱(chēng)為jobs,macrotask可稱(chēng)為task。

分別很么樣的場(chǎng)景會(huì)形成macrotask和microtask呢?

macrotask:主代碼塊,setTimeout,setInterval, setImmediate, I/O, UI rendering. 等(可以看到,事件隊(duì)列中的每一個(gè)事件都是一個(gè)macrotask)

microtask: process.nextTick, Promise(原生),Object.observe,MutationObserver

在node環(huán)境下,process.nextTick的優(yōu)先級(jí)高于Promise,也就是可以簡(jiǎn)單理解為:在宏任務(wù)結(jié)束后會(huì)先執(zhí)行微任務(wù)隊(duì)列中的nextTickQueue部分,然后才會(huì)執(zhí)行微任務(wù)中的Promise部分。
總結(jié)下運(yùn)行機(jī)制:

執(zhí)行一個(gè)宏任務(wù)(棧中沒(méi)有就從事件隊(duì)列中獲取)

執(zhí)行過(guò)程中如果遇到微任務(wù),就將它添加到微任務(wù)的任務(wù)隊(duì)列中

宏任務(wù)執(zhí)行完畢后,立即執(zhí)行當(dāng)前微任務(wù)隊(duì)列中的所有微任務(wù)(依次執(zhí)行)

當(dāng)前宏任務(wù)執(zhí)行完畢,開(kāi)始檢查渲染,然后GUI線(xiàn)程接管渲染

渲染完畢后,JS線(xiàn)程繼續(xù)接管,開(kāi)始下一個(gè)宏任務(wù)(從事件隊(duì)列中獲?。?/p> 案例說(shuō)明

案例1:

setImmediate(function(){
    console.log(1);
},0);
setTimeout(function(){
    console.log(2);
},0);
new Promise(function(resolve){
    console.log(3);
    resolve();
    console.log(4);
}).then(function(){
    console.log(5);
});
console.log(6);
process.nextTick(function(){
    console.log(7);
});
console.log(8);

根據(jù)js的運(yùn)行原理解釋上面代碼的執(zhí)行順序:

第一步 script整體代碼被執(zhí)行,執(zhí)行過(guò)程為
創(chuàng)建setImmediate macro-task
創(chuàng)建setTimeout macro-task
創(chuàng)建micro-task Promise.then 的回調(diào),并執(zhí)行script console.log(3); resolve(); console.log(4); 此時(shí)輸出3和4,雖然resolve調(diào)用了,執(zhí)行了但是整體代碼還沒(méi)執(zhí)行完,無(wú)法進(jìn)入Promise.then 流程。
console.log(6)輸出6
process.nextTick 創(chuàng)建micro-task
console.log(8) 輸出8
第一個(gè)過(guò)程過(guò)后,已經(jīng)輸出了3 4 6 8

第二步 由于其他micro-task 的 優(yōu)先級(jí)高于macro-task。

此時(shí)micro-task 中有兩個(gè)任務(wù)按照優(yōu)先級(jí)process.nextTick 高于 Promise。 
所以先輸出7,再輸出5

第三步 micro-task 任務(wù)列表已經(jīng)執(zhí)行完畢,家下來(lái)執(zhí)行macro-task. 由于setTimeout的優(yōu)先級(jí)高于setIImmediate,所以先輸出2,再輸出1。

參考:https://blog.csdn.net/gy_u_yg...
https://blog.csdn.net/m0_3775...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/100507.html

相關(guān)文章

  • js運(yùn)行機(jī)制異步編程

    摘要:的執(zhí)行機(jī)制就是一個(gè)主線(xiàn)程一個(gè)任務(wù)隊(duì)列。同步任務(wù)就是放在主線(xiàn)程上執(zhí)行的任務(wù),異步任務(wù)就是放在任務(wù)隊(duì)列的任務(wù)。和上述運(yùn)行的機(jī)制主要說(shuō)明的是,而的出現(xiàn)及普及,又有了新的概念,,它的出現(xiàn),進(jìn)一步,中分為兩種任務(wù)類(lèi)型和,在中,稱(chēng)為,可稱(chēng)為。 上一篇文章主要整理了一下js引擎是如何工作的,這篇文章主要整理js的事件循環(huán)Event loop,以及異步編程的原理 事件循環(huán)Event loop 之前文章...

    nifhlheimr 評(píng)論0 收藏0
  • js運(yùn)行機(jī)制異步編程(一)

    摘要:引擎的運(yùn)行原理引擎也是程序,是屬于瀏覽器的一部分,由瀏覽器廠(chǎng)商自行開(kāi)發(fā)。為了提高運(yùn)行速度,現(xiàn)代瀏覽器一般采用即時(shí)編譯即字節(jié)碼只在運(yùn)行時(shí)編譯,用到哪一行就編譯哪一行,并且把編譯結(jié)果緩存這樣整個(gè)程序的運(yùn)行速度能得到顯著提升。 相信大家在面試的過(guò)程中經(jīng)常遇到查看執(zhí)行順序的問(wèn)題,如setTimeout,promise,async await等等,各種組合,是不是感覺(jué)頭都要暈掉了,其實(shí)這些問(wèn)題最...

    wudengzan 評(píng)論0 收藏0
  • js運(yùn)行機(jī)制異步編程(一)

    摘要:引擎的運(yùn)行原理引擎也是程序,是屬于瀏覽器的一部分,由瀏覽器廠(chǎng)商自行開(kāi)發(fā)。為了提高運(yùn)行速度,現(xiàn)代瀏覽器一般采用即時(shí)編譯即字節(jié)碼只在運(yùn)行時(shí)編譯,用到哪一行就編譯哪一行,并且把編譯結(jié)果緩存這樣整個(gè)程序的運(yùn)行速度能得到顯著提升。 相信大家在面試的過(guò)程中經(jīng)常遇到查看執(zhí)行順序的問(wèn)題,如setTimeout,promise,async await等等,各種組合,是不是感覺(jué)頭都要暈掉了,其實(shí)這些問(wèn)題最...

    happen 評(píng)論0 收藏0
  • 前端知識(shí)歸納

    摘要:繼承性子標(biāo)簽會(huì)繼承父標(biāo)簽樣式優(yōu)先級(jí)行內(nèi)樣式選擇器類(lèi)選擇器標(biāo)簽選擇器通配符繼承機(jī)制創(chuàng)建了的元素中,在垂直方向上的會(huì)發(fā)生重疊。 技能考察: 一、關(guān)于Html 1、html語(yǔ)義化標(biāo)簽的理解; 結(jié)構(gòu)化的理解; 能否寫(xiě)出簡(jiǎn)潔的html結(jié)構(gòu); SEO優(yōu)化 a、理解:根據(jù)內(nèi)容的結(jié)構(gòu)化(內(nèi)容語(yǔ)義化),選擇合適的標(biāo)簽(代碼語(yǔ)義化)便于開(kāi)發(fā)者閱讀和寫(xiě)出更優(yōu)雅的代碼的同時(shí) 讓瀏覽器的爬蟲(chóng)和...

    魏憲會(huì) 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<