更新時(shí)間:2021-10-07 來(lái)源:黑馬程序員 瀏覽量:
JavaScript 是一門(mén)單線(xiàn)程執(zhí)行的編程語(yǔ)言。也就是說(shuō),同一時(shí)間只能做一件事情。如果前一個(gè)任務(wù)非常耗時(shí),則后續(xù)的任務(wù)就不得不一直等待,從而導(dǎo)致程序假死的問(wèn)題。所以為了防止某個(gè)耗時(shí)任務(wù)導(dǎo)致程序假死的問(wèn)題,JavaScript 把待執(zhí)行的任務(wù)分為了兩類(lèi):
①同步任務(wù)(synchronous)
又叫做非耗時(shí)任務(wù),指的是在主線(xiàn)程上排隊(duì)執(zhí)行的那些任務(wù)
只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行后一個(gè)任務(wù)
②異步任務(wù)(asynchronous)
又叫做耗時(shí)任務(wù),異步任務(wù)由JavaScript 委托給宿主環(huán)境進(jìn)行執(zhí)行
當(dāng)異步任務(wù)執(zhí)行完成后,會(huì)通知JavaScript 主線(xiàn)程執(zhí)行異步任務(wù)的回調(diào)函數(shù)
同步任務(wù)和異步任務(wù)的執(zhí)行過(guò)程:
①同步任務(wù)由JavaScript 主線(xiàn)程次序執(zhí)行
②異步任務(wù)委托給宿主環(huán)境執(zhí)行
③已完成的異步任務(wù)對(duì)應(yīng)的回調(diào)函數(shù),會(huì)被加入到任務(wù)隊(duì)列中等待執(zhí)行
④JavaScript 主線(xiàn)程的執(zhí)行棧被清空后,會(huì)讀取任務(wù)隊(duì)列中的回調(diào)函數(shù),次序執(zhí)行
⑤JavaScript 主線(xiàn)程不斷重復(fù)上面的第4 步
JavaScript 主線(xiàn)程從“任務(wù)隊(duì)列”中讀取異步任務(wù)的回調(diào)函數(shù),放到執(zhí)行棧中依次執(zhí)行。這個(gè)過(guò)程是循環(huán)不斷的,所以整個(gè)的這種運(yùn)行機(jī)制又稱(chēng)為EventLoop(事件循環(huán))。
import thenFs from ' then-fs ' console log('A') thenFs. readFile(' ./files/1.txt', 'utf8' ). then(dataStr => { console.log('B') }) setTimeout(( ) => { console. log('C' ) },0) console.log( 'D')
正確的輸出結(jié)果:ADCB。其中:
A 和D 屬于同步任務(wù)。會(huì)根據(jù)代碼的先后順序依次被執(zhí)行
C 和B 屬于異步任務(wù)。它們的回調(diào)函數(shù)會(huì)被加入到任務(wù)隊(duì)列中,等待主線(xiàn)程空閑時(shí)再執(zhí)行
猜你喜歡:
從async/await面試題看宏觀(guān)任務(wù)和微觀(guān)任務(wù)
如何實(shí)現(xiàn)計(jì)算機(jī)多任務(wù)運(yùn)行?