巨集任務與微任務

2022-02-28 14:29:02 字數 1420 閱讀 5578

之前我們討論過js**執行的同步和非同步,js的單執行緒執行機制不會改變;但是僅僅懂得同步非同步是遠遠不夠的;比如說下面這些**:

1 settimeout(function

());

4new promise(function

(resolve,reject)).then(function

())10 console.log("4");

由於同步和非同步的影響,我們會自信的說出列印結果是: 2,3,4,1;可是呢,用chrome開啟執行**,蒙了,列印的竟然是:2 ,4 ,3,1;

這就不得不引出我們即將討論的主角:巨集任務和微任務;簡單來說:js中,大部分**被分配到巨集任務排隊執行,但像promise.then、process.nexttick()等微任務;我們就拿promise.then來舉例說明。根據先執行微任務再執行巨集任務的機制;還是上面那段**,我們簡單的分析一下:

settimeout(function

());

new promise(function

(resolve,reject)).then(

function

()) console.log("4");

這些**整體作為乙個巨集任務開始執行,還是按照先同步,後非同步的規則,遇到延時定時器,是個非同步**,先掛起來不執行;接著遇到promise的例項化物件,屬於同步任務,立即執行,列印乙個2;接下來遇到例項化物件的微任務,但後面還有乙個同步**,依然是先執行同步**,列印4;接下來一輪跑完了,我們回頭看,有乙個延時定時器,還有乙個微任務,先執行微任務,列印出3,最後列印1;就像跑了第二遍一樣,這就是乙個最簡單的時間迴圈(event loop);

接下來寫一段稍微複雜的,讀者們可以一起思考一下:

console.log('1');

settimeout(

function

() ).then(

function

() )

})new promise(function

(resolve) ).then(

function

() )

settimeout(

function

() ).then(

function

() )

})console.log('10');

整段**作為乙個巨集任務,先執行同步**,所以第一次時間迴圈後會列印出:1,5,10;接下來發現有微任務:列印乙個6;開始第二輪迴圈,2個非同步**並且都是立即執行的延時定時器,我們就按照從上到下的順序執行,先看第乙個定時器(此時這就是乙個巨集任務):會列印出2,3;然後執行微任務,列印4;最後看第二個定時器:一次列印:7,8,9;over;

再此感謝掘金的ssssyoki大神的講解,再加上自己的一些理解;希望這篇文章可以對你帶來些許幫助;

巨集任務與微任務

js是單執行緒,所以也可以說是主線程,所以js 都是在主線程執行的,只不過我們要區分它是同步執行還是非同步執行 當乙個 是非同步的話,對應的是 函式。不同的任務對應不同的 比如 定時器的 傳送js的 對應事件的 定時器模組,網路請求模組,事件處理模組,的執行取決於模組什麼時候將 函式放入到事件佇列e...

js 巨集任務與微任務總結

script settimeout setinterval messagechannel postmessage setimmediate requestanimationframe i o操作 ui渲染 process.nexttick mutationobserver promise.then ...

巨集任務和微任務

概念 1.巨集任務 當前呼叫棧中執行的 成為巨集任務。主 快,定時器等等 3.巨集任務中的事件放在callback queue中,由事件觸發執行緒維護 微任務的事件放在微任務佇列中,由js引擎執行緒維護。執行機制02 1.在執行棧中執行乙個巨集任務。2.執行過程中遇到微任務,將微任務新增到微任務佇列...