最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript實(shí)現(xiàn)異步編程的過(guò)程

 更新時(shí)間:2018年06月18日 09:17:14   作者:大雄的學(xué)習(xí)人生  
這篇內(nèi)容詳細(xì)分析了Javascript實(shí)現(xiàn)異步編程的過(guò)程以及原理解釋,對(duì)此知識(shí)點(diǎn)有興趣的朋友可以學(xué)習(xí)下。

相信不少人對(duì)Javascript單線程表示懷疑:為何單線程可以實(shí)現(xiàn)異步操作呢?其實(shí)Javascript確實(shí)是單線程的(我們不妨把這個(gè)線程稱作主線程),但它實(shí)現(xiàn)異步操作的方式確實(shí)借助了瀏覽器的其他線程的幫助。那其他線程是怎么幫助Javascript主線程來(lái)實(shí)現(xiàn)異步的呢?答案就是任務(wù)隊(duì)列(task queue)和事件循環(huán)(event loop)。

任務(wù)隊(duì)列

首先,作為單線程語(yǔ)言,在Javascript中定義的任務(wù)都會(huì)在主線程中執(zhí)行。但是并不是每個(gè)任務(wù)都會(huì)立刻執(zhí)行,而這種不立刻執(zhí)行的任務(wù)我們稱作異步任務(wù)。相反,那些立刻執(zhí)行的任務(wù)我們把它們稱作同步任務(wù)。而這些異步任務(wù)都會(huì)交給瀏覽器的其他線程去執(zhí)行,但是主線程需要了解這些異步任務(wù)執(zhí)行的狀態(tài),才方便進(jìn)行下一步操作。

打個(gè)比方,主線程準(zhǔn)備做飯,所以下達(dá)一個(gè)異步任務(wù)去買菜,異步任務(wù)買完菜之后得告訴主線程:“我買完菜啦”,這個(gè)時(shí)候主線程才好開始做飯。

而我們知道因?yàn)镴avascript是單線程,所以上述的“下一步操作”沒法直接定義在主函數(shù)里(不然就被當(dāng)做同步任務(wù)直接執(zhí)行了),那這些應(yīng)該定義在哪里呢?答案就是異步任務(wù)的回調(diào)函數(shù)中。在Javascript異步機(jī)制中,任務(wù)隊(duì)列就是用來(lái)維護(hù)異步任務(wù)回調(diào)函數(shù)的隊(duì)列。這樣一個(gè)隊(duì)列用來(lái)存放這些回調(diào)函數(shù),它們會(huì)等到主線程執(zhí)行完所有的同步函數(shù)之后按照先進(jìn)先出的方式挨個(gè)執(zhí)行。那么執(zhí)行完任務(wù)隊(duì)列之后呢?Javascript主線程就執(zhí)行完畢了嗎?當(dāng)然不是,不然網(wǎng)頁(yè)加載完畢之后,誰(shuí)來(lái)處理后續(xù)與用戶的交互事件(比如點(diǎn)擊事件)呢?

事件循環(huán)

我們通過(guò)上圖來(lái)更加形象的了解Javascript的異步機(jī)制。

執(zhí)行同步任務(wù) -> 檢查任務(wù)隊(duì)列中是否有任務(wù) -> [有如果則執(zhí)行] -> 檢查任務(wù)隊(duì)列中是否有任務(wù) -> [有如果則執(zhí)行] -> ......
可見主線程在執(zhí)行完同步任務(wù)之后,會(huì)無(wú)限循環(huán)地去檢查任務(wù)隊(duì)列中是否有新的“任務(wù)”,如果有則執(zhí)行。而這些任務(wù)包括我們?cè)诋惒饺蝿?wù)中定義的回調(diào)函數(shù),也包括用戶交互事件的回調(diào)函數(shù)。通過(guò)事件循環(huán),Javascript不僅很好的處理了異步任務(wù),也很好的完成了與用戶交互事件的處理。因?yàn)樵谕瓿僧惒饺蝿?wù)的回調(diào)函數(shù)之后,任務(wù)隊(duì)列中的任務(wù)都是由事件所產(chǎn)生的,因此我們也把上述的循環(huán)過(guò)程叫做事件循環(huán)。

異步機(jī)制實(shí)踐

console.log('定時(shí)器去買菜吧')
setTimeout(function(){
 console.log('菜買完了,主線程去做菜吧')
}, 0)
console.log('你先去買菜,我先看個(gè)世界杯')

在瀏覽器中執(zhí)行上述代碼,興許能更好地理解Javascript的異步機(jī)制。

總結(jié)

總而言之,Javascript單線程的背后有瀏覽器的其他線程為其完成異步服務(wù),這些異步任務(wù)為了和主線程通信,通過(guò)將回調(diào)函數(shù)推入到任務(wù)隊(duì)列等待執(zhí)行。主線程所做的就是執(zhí)行完同步任務(wù)后,通過(guò)事件循環(huán),不斷地檢查并執(zhí)行任務(wù)隊(duì)列中回調(diào)函數(shù)。

相關(guān)文章

最新評(píng)論

卢龙县| 镇原县| 旬阳县| 汉川市| 台东县| 和龙市| 阳山县| 景东| 喀什市| 淮北市| 辽阳县| 吉水县| 林口县| 松桃| 东港市| 辉南县| 阿拉善盟| 绥德县| 冕宁县| 辽宁省| 舟曲县| 尤溪县| 方山县| 凌源市| 桂林市| 商河县| 宝清县| 始兴县| 海盐县| 洪雅县| 元江| 淮安市| 伊通| 望奎县| 洛宁县| 噶尔县| 庆安县| 巢湖市| 宁陵县| 奎屯市| 文化|