亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

同步與異步、異步與回調(diào)

dinfer / 1321人閱讀

摘要:同步與異步以上為同步代碼,函數(shù)必須等函數(shù)執(zhí)行完畢后才能執(zhí)行。異步回調(diào)產(chǎn)生的結(jié)果就是,函數(shù)的調(diào)用并不直接返回結(jié)果,而往往是交給回調(diào)函數(shù)進(jìn)行異步處理。

同步與異步:
    function a(){}
    function b(){}
    
    a();
    b();

以上為同步代碼,函數(shù)b必須等函數(shù)a執(zhí)行完畢后才能執(zhí)行。

    function a(){
        setTimeout(function(){
            b();
        }, 1000);
    };
    function c(){};
    
    a();
    c();

首先執(zhí)行函數(shù)a,而且不等setTimeout執(zhí)行就執(zhí)行函數(shù)c,等待至少1s的時(shí)候后才會(huì)執(zhí)行函數(shù)b.實(shí)際上在是等待了1s后將函數(shù)b放到了event queue里面,此時(shí)要等待主線程空閑的時(shí)候,才會(huì)取event queue里面等待的回調(diào)函數(shù)進(jìn)行執(zhí)行。

以上是一段簡(jiǎn)單的異步代碼,js里面最基礎(chǔ)的異步實(shí)現(xiàn)就是調(diào)用setTimeout,setInterval

關(guān)于js的異步實(shí)現(xiàn)請(qǐng)看下面的list:
談?wù)刯avascript的異步實(shí)現(xiàn)

回調(diào):

回調(diào)函數(shù):在js里面簡(jiǎn)單點(diǎn)來說,就是函數(shù)被當(dāng)作參數(shù)傳入另外一個(gè)函數(shù)當(dāng)中,并在那個(gè)函數(shù)中被調(diào)用。

    
    var b = function (){
        //執(zhí)行相關(guān)的代碼
    }
    var a = function (b){
        //執(zhí)行相關(guān)的代碼
        b();
    }
    
    a(b);
異步與回調(diào):

大家可能平時(shí)聽的比較多的是異步回調(diào),但是必須搞清楚,異步與回調(diào)并沒有直接的聯(lián)系,回調(diào)只是異步的一種實(shí)現(xiàn)方式。
當(dāng)然還有同步回調(diào),即上面回調(diào)部分舉的簡(jiǎn)單的例子。一般使用回調(diào)函數(shù)主要是將父函數(shù)的執(zhí)行結(jié)果通知給回調(diào)函數(shù)進(jìn)行處理。

關(guān)于異步我的理解是:

因?yàn)閖s是單線程的,如果所有的操作(如ajax操作,獲取遠(yuǎn)程的js文件等IO操作)是同步的,遇到那些耗時(shí)的操作,后面的程序必然被阻塞不能執(zhí)行,頁面也就失去了響應(yīng)。因此js采用了事件驅(qū)動(dòng)機(jī)制,在單線程模型下,使用異步回調(diào)函數(shù)的方式來實(shí)現(xiàn)非阻塞的IO操作。

異步任務(wù) 是指js在主線程(stack)運(yùn)行的過程當(dāng)中,當(dāng)stack空閑的時(shí)候,主線程對(duì)event queque輪詢(事實(shí)上一直在輪詢)后,將異步任務(wù)放到stack里面進(jìn)行執(zhí)行。簡(jiǎn)單點(diǎn)說,只要指定過回調(diào)函數(shù),那么當(dāng)這些事件發(fā)生的時(shí)候就會(huì)進(jìn)入事件隊(duì)列,等待主線程的stack空閑的時(shí)候,就會(huì)對(duì)event queue里面的回調(diào)讀取并放到stack里面執(zhí)行。

看一段ajax實(shí)現(xiàn)的代碼:

    var xhr = new XMLHttpRequest();
    xhr.open("POST", url, true);   //第三個(gè)參數(shù)決定是否采用異步的方式
    xhr.send(data);
    xhr.onreadystatechange = function(){
        if(xhr.readystate === 4 && xhr.status === 200){
                ///xxxx
        }
    }

這里ajax請(qǐng)求是異步的,因?yàn)闉g覽器會(huì)新開一個(gè)線程請(qǐng)求,當(dāng)請(qǐng)求的狀態(tài)(readystate)發(fā)生改變,因?yàn)橹熬驮O(shè)置了回調(diào)函數(shù),每次狀態(tài)發(fā)生改變都會(huì)調(diào)用相應(yīng)的回調(diào)函數(shù),當(dāng)(xhr.readystate === 4 && xhr.status === 200)的時(shí)候,回調(diào)函數(shù)進(jìn)入了event queue,等待主線程空閑的時(shí)候,并且event queue里面排在這個(gè)回調(diào)前面沒有其他回調(diào)的時(shí)候就會(huì)得到執(zhí)行。

異步回調(diào)產(chǎn)生的結(jié)果就是,函數(shù)的調(diào)用并不直接返回結(jié)果,而往往是交給回調(diào)函數(shù)進(jìn)行異步處理。

因此在異步編程當(dāng)中,需要注意幾個(gè)地方:

需要把依賴于異步函數(shù)(需要其執(zhí)行結(jié)果或者達(dá)到某種狀態(tài))的代碼放在對(duì)應(yīng)的回調(diào)函數(shù)中(例如上面的ajax的例子)

異步函數(shù)后面的代碼會(huì)立即執(zhí)行(因此需要知道某段代碼是否為異步的)

另外還有一個(gè)關(guān)于script標(biāo)簽異步加載的內(nèi)容:
大家記得請(qǐng)求遠(yuǎn)程腳本標(biāo)簽嗎?

    

在script標(biāo)簽里面加入了async屬性或者defer屬性后,同樣變成了異步了。
關(guān)于這部分的內(nèi)容,請(qǐng)移步:
async和defer的區(qū)別

另外關(guān)于這部分的內(nèi)容還有一些List:
并發(fā)模型與event loop
樸靈評(píng)阮老師的event loop

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/86138.html

相關(guān)文章

  • JS—異步、回調(diào)、高階函數(shù)

    摘要:而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個(gè)調(diào)用。請(qǐng)求程序發(fā)出請(qǐng)求,從服務(wù)器端獲取數(shù)據(jù),并設(shè)置了回調(diào)函數(shù)。然后,瀏覽器會(huì)設(shè)置偵聽來自網(wǎng)絡(luò)的響應(yīng),拿到數(shù)據(jù)后,將該回調(diào)函數(shù)插入到事件循環(huán)。 并發(fā)與并行 并發(fā)是指兩個(gè)或多個(gè)事件鏈隨時(shí)間發(fā)展交替執(zhí)行,以至于從更高的層次來看,就像是同時(shí)運(yùn)行(但在任意時(shí)刻只處理一個(gè)事件) 并發(fā)的關(guān)鍵是你有處理多個(gè)任務(wù)的能力,不一定同...

    Dean 評(píng)論0 收藏0
  • 異步

    摘要:在異步機(jī)制中,任務(wù)隊(duì)列就是用來維護(hù)異步任務(wù)回調(diào)函數(shù)的隊(duì)列。四對(duì)象對(duì)象是工作組提出的一種規(guī)范,目的是為異步編程提供統(tǒng)一接口。 異步 1.JavaScript單線程的理解 Javascript語言的執(zhí)行環(huán)境是單線程(single thread)。所謂單線程,就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。 2.JavaScript單線...

    goji 評(píng)論0 收藏0
  • 淺析JavaScript異步

    摘要:回調(diào)函數(shù),一般在同步情境下是最后執(zhí)行的,而在異步情境下有可能不執(zhí)行,因?yàn)槭录]有被觸發(fā)或者條件不滿足。同步方式請(qǐng)求異步同步請(qǐng)求當(dāng)請(qǐng)求開始發(fā)送時(shí),瀏覽器事件線程通知主線程,讓線程發(fā)送數(shù)據(jù)請(qǐng)求,主線程收到 一直以來都知道JavaScript是一門單線程語言,在筆試過程中不斷的遇到一些輸出結(jié)果的問題,考量的是對(duì)異步編程掌握情況。一般被問到異步的時(shí)候腦子里第一反應(yīng)就是Ajax,setTimse...

    Tangpj 評(píng)論0 收藏0
  • JavaScript:徹底理解同步、異步和事件循環(huán)(Event Loop)

    摘要:例如處理請(qǐng)求的線程處理事件的線程定時(shí)器線程讀寫文件的線程例如在中等等。事件循環(huán)事件循環(huán)是指主線程重復(fù)從消息隊(duì)列中取消息執(zhí)行的過程。事件觸發(fā)時(shí),表示異步任務(wù)完成,會(huì)將事件監(jiān)聽器函數(shù)封裝成一條消息放到消息隊(duì)列中,等待主線程執(zhí)行。 一. 單線程 我們常說JavaScript是單線程的。 所謂單線程,是指在JS引擎中負(fù)責(zé)解釋和執(zhí)行JavaScript代碼的線程只有一個(gè)。不妨叫它主線程。 但是實(shí)...

    wenyiweb 評(píng)論0 收藏0
  • 總結(jié):JavaScript異步、事件循環(huán)消息隊(duì)列、微任務(wù)宏任務(wù)

    摘要:?jiǎn)尉€程異步非阻塞然后,這又牽扯到了事件循環(huán)消息隊(duì)列,還有微任務(wù)宏任務(wù)這些。此步的位置不確定某個(gè)時(shí)刻后,定時(shí)器觸發(fā)線程通知事件觸發(fā)線程,事件觸發(fā)線程將回調(diào)函數(shù)加入消息隊(duì)列隊(duì)尾,等待引擎線程執(zhí)行。 前言 Philip Roberts 在演講 great talk at JSConf on the event loop 中說:要是用一句話來形容 JavaScript,我可能會(huì)這樣: Java...

    qianfeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<