JavaScript 異步和回調函數

JavaScript語言的執行環境是單線程的,便是一次只能完成一個任務,其餘任務排隊等候執行。只有當前一個任務完成時,才能開始進行下一個任務。編程

這種模式的執行環境簡單,如果遇到一個耗時較長的任務,將會拖延整個程序的執行。異步

爲了解決這個問題,咱們有同步和異步兩種任務的執行模式:異步編程

同步模式即上述所說的單線程模式;
異步模式:每一個任務都有回調函數(callback),
前一個任務結束後,不是執行後一個任務,而是執行回調函數,
後一個任務則是不等前一個任務結束就執行,
因此程序的執行順序與任務的排列順序是不一致的、異步的。

小劇場:函數

顧客1(打電話):
    老闆,我要買本小黃書,你有嗎?
老闆:
    我找找,一下子給你回電話。( 老闆幹其餘事情。)
顧客2(打電話):
    老闆,我要買本紅包書,你有嗎?
老闆:
    我找找,一下子給你回電話。( 老闆幹其餘事情。)
                …………
找到書,老闆回電話。

劇場說明線程

其中回電話就是咱們的回調函數,而找書就是任務。
異步:
    找到書(前一個任務完成)就回電話(執行回調函數),
    然後一個任務(找書)無論前一個任務是否完成都會開始。
同步:
    老闆接了電話就開始找書(保持通話狀態),
    直到書找到知足顧客1的需求,
    顧客2的電話才能打得進來。

回調函數:
回調函數是實現異步編程的最基本的方法。咱們假設有兩個函數f1()和f2(),f1()執行完成後才能執行f2():code

f1();
   f2();

假設f1()是一個很耗時的任務,那麼咱們能夠考慮異步機制,改寫f1(),將f2改寫爲f1()的回調函數:ip

function f1 (callback) {
    
    setTimeout(function () {
    callback()},1000);
    
    }
    
    f1(f2);

採用這種方式,咱們把同步操做變成了異步操做,f1不會堵塞程序的運行,也就是說咱們先執行程序的主要邏輯,將耗時的操做推遲執行。回調函數

歡迎討論和指出不足^_^同步

相關文章
相關標籤/搜索