摘要:異步找到書前一個(gè)任務(wù)完成就回電話執(zhí)行回調(diào)函數(shù),而后一個(gè)任務(wù)找書不管前一個(gè)任務(wù)是否完成都會開始。回調(diào)函數(shù)回調(diào)函數(shù)是實(shí)現(xiàn)異步編程的最基本的方法。
JavaScript語言的執(zhí)行環(huán)境是單線程的,即是一次只能完成一個(gè)任務(wù),其他任務(wù)排隊(duì)等候執(zhí)行。只有當(dāng)前一個(gè)任務(wù)完成時(shí),才能開始進(jìn)行下一個(gè)任務(wù)。
這種模式的執(zhí)行環(huán)境簡單,若是遇到一個(gè)耗時(shí)較長的任務(wù),將會拖延整個(gè)程序的執(zhí)行。
為了解決這個(gè)問題,我們有同步和異步兩種任務(wù)的執(zhí)行模式:
同步模式即上述所說的單線程模式; 異步模式:每個(gè)任務(wù)都有回調(diào)函數(shù)(callback), 前一個(gè)任務(wù)結(jié)束后,不是執(zhí)行后一個(gè)任務(wù),而是執(zhí)行回調(diào)函數(shù), 后一個(gè)任務(wù)則是不等前一個(gè)任務(wù)結(jié)束就執(zhí)行, 所以程序的執(zhí)行順序與任務(wù)的排列順序是不一致的、異步的。
小劇場:
顧客1(打電話): 老板,我要買本小黃書,你有嗎? 老板: 我找找,一會兒給你回電話。( 老板干其他事情。) 顧客2(打電話): 老板,我要買本紅包書,你有嗎? 老板: 我找找,一會兒給你回電話。( 老板干其他事情。) ………… 找到書,老板回電話。
劇場說明
其中回電話就是我們的回調(diào)函數(shù),而找書就是任務(wù)。 異步: 找到書(前一個(gè)任務(wù)完成)就回電話(執(zhí)行回調(diào)函數(shù)), 而后一個(gè)任務(wù)(找書)不管前一個(gè)任務(wù)是否完成都會開始。 同步: 老板接了電話就開始找書(保持通話狀態(tài)), 直到書找到滿足顧客1的需求, 顧客2的電話才能打得進(jìn)來。
回調(diào)函數(shù):
回調(diào)函數(shù)是實(shí)現(xiàn)異步編程的最基本的方法。我們假設(shè)有兩個(gè)函數(shù)f1()和f2(),f1()執(zhí)行完成后才能執(zhí)行f2():
f1(); f2();
假設(shè)f1()是一個(gè)很耗時(shí)的任務(wù),那么我們可以考慮異步機(jī)制,改寫f1(),將f2改寫為f1()的回調(diào)函數(shù):
function f1 (callback) { setTimeout(function () { callback()},1000); } f1(f2);
采用這種方式,我們把同步操作變成了異步操作,f1不會堵塞程序的運(yùn)行,也就是說我們先執(zhí)行程序的主要邏輯,將耗時(shí)的操作推遲執(zhí)行。
歡迎討論和指出不足^_^
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89792.html
摘要:到這里,我已經(jīng)發(fā)出了一個(gè)請求買漢堡,啟動(dòng)了一次交易。但是做漢堡需要時(shí)間,我不能馬上得到這個(gè)漢堡,收銀員給我一個(gè)收據(jù)來代替漢堡。到這里,收據(jù)就是一個(gè)承諾保證我最后能得到漢堡。 同期異步系列文章推薦談一談javascript異步j(luò)avascript異步中的回調(diào)javascript異步之Promise.all()、Promise.race()、Promise.finally()javascr...
摘要:回調(diào)函數(shù),一般在同步情境下是最后執(zhí)行的,而在異步情境下有可能不執(zhí)行,因?yàn)槭录]有被觸發(fā)或者條件不滿足。同步方式請求異步同步請求當(dāng)請求開始發(fā)送時(shí),瀏覽器事件線程通知主線程,讓線程發(fā)送數(shù)據(jù)請求,主線程收到 一直以來都知道JavaScript是一門單線程語言,在筆試過程中不斷的遇到一些輸出結(jié)果的問題,考量的是對異步編程掌握情況。一般被問到異步的時(shí)候腦子里第一反應(yīng)就是Ajax,setTimse...
摘要:如果你把函數(shù)的指針地址作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對該事件或條件進(jìn)行響應(yīng)。 同期異步系列文章推薦談一談javascript異步j(luò)avascript異步與promisejavascript異步之Promise.all()、Promise.ra...
摘要:在異步機(jī)制中,任務(wù)隊(duì)列就是用來維護(hù)異步任務(wù)回調(diào)函數(shù)的隊(duì)列。四對象對象是工作組提出的一種規(guī)范,目的是為異步編程提供統(tǒng)一接口。 異步 1.JavaScript單線程的理解 Javascript語言的執(zhí)行環(huán)境是單線程(single thread)。所謂單線程,就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。 2.JavaScript單線...
摘要:由于引擎同一時(shí)間只執(zhí)行一段代碼這是由單線程的性質(zhì)決定的,所以每個(gè)代碼塊阻塞了其它異步事件的進(jìn)行。這意味著瀏覽器將等待著一個(gè)新的異步事件發(fā)生。異步的任務(wù)執(zhí)行的順序是不固定的,主要看返回的速度。 我們經(jīng)常說JS是單線程的,比如node.js研討會上大家都說JS的特色之一是單線程的,這樣使JS更簡單明了,可是大家真的理解所謂JS的單線程機(jī)制嗎?單線程時(shí),基于事件的異步機(jī)制又該當(dāng)如何,這些知識...
摘要:調(diào)用棧被清空,消息隊(duì)列中并無任務(wù),線程停止,事件循環(huán)結(jié)束。不確定的時(shí)間點(diǎn)請求返回,將設(shè)定好的回調(diào)函數(shù)放入消息隊(duì)列。調(diào)用棧執(zhí)行完畢執(zhí)行消息隊(duì)列任務(wù)。請求并發(fā)回調(diào)函數(shù)執(zhí)行順序無法確定。 異步編程 JavaScript中異步編程問題可以說是基礎(chǔ)中的重點(diǎn),也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執(zhí)行的時(shí)候是從上到下按順序執(zhí)行,一段代碼執(zhí)行了之后才會執(zhí)行下一段代碼,這種方式...
閱讀 3164·2021-11-19 09:40
閱讀 3653·2021-11-16 11:52
閱讀 2984·2021-11-11 16:55
閱讀 3174·2019-08-30 15:55
閱讀 1182·2019-08-30 13:08
閱讀 1659·2019-08-29 17:03
閱讀 3016·2019-08-29 16:19
閱讀 2583·2019-08-29 13:43