淺談js的非同步執行的作用

淺談js的非同步執行的作用

  1.Javascript語言的執行環境是”單執行緒”(single thread):

  優點:實現起來比較簡單,執行環境相對單純;

  缺點:只要有一個任務耗時很長,後面的任務都必須排隊等著,會拖延整個程式的執行。常見的瀏覽器無響應(假死),往往就是因為某一段Javascript程式碼長時間執行(比如死迴圈),導致整個頁面卡在這個地方,其他任務無法執行。

  為了解決這個問題,Javascript語言將任務的執行模式分成兩種:同步(Synchronous)和非同步(Asynchronous)。

  2.”非同步模式”程式設計的幾種方法:

  (1)回撥函式:優點是簡單、容易理解和部署,缺點是不利於程式碼的閱讀和維護,各個部分之間高度耦合(Coupling),使得程式結構混亂、流程難以追蹤(尤其是回撥函式巢狀的情況),而且每個任務只能指定一個回撥函式。

  (2)採用事件驅動模式(事件監聽):優點是比較容易理解,可以繫結多個事件,每個事件可以指定多個回撥函式,而且可以”去耦合“(Decoupling),有利於實現模組化。缺點是整個程式都要變成事件驅動型,執行流程會變得很不清晰。

  (3)觀察者模式(釋出訂閱模式):這種方法的性質與”事件監聽”類似,但是明顯優於後者。因為我們可以透過檢視”訊息中心”,瞭解存在多少訊號、每個訊號有多少訂閱者,從而監控程式的執行。

  3.非同步操作的流程控制。

  (1)序列執行:編寫一個流程控制函式,讓它來控制非同步任務,一個任務完成以後,再執行另一個。

  函式series就是序列函式,它會依次執行非同步任務,所有任務都完成後,才會執行final函式。items陣列儲存每一個非同步任務的引數,results陣列儲存每一個非同步任務的'執行結果。

  (2)並行執行:所有非同步任務同時執行,等到全部完成以後,才執行final函式。

  方法會同時發起6個非同步任務,等到它們全部完成以後,才會執行final函式。

  並行執行的好處是效率較高,比起序列執行一次只能執行一個任務,較為節約時間。但是問題在於如果並行的任務較多,很容易耗盡系統資源,拖慢執行速度。因此有了第三種流程控制方式。

  (3)並行與序列的結合:設定一個門檻,每次最多隻能並行執行n個非同步任務。這樣就避免了過分佔用系統資源。

  變數running記錄當前正在執行的任務數,只要低於門檻值,就再啟動一個新的任務//如果等於0,就表示所有任務都執行完了,這時就執行final函式最多隻能同時執行兩個非同步任務。

最近訪問