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