異步編程的4種方式

異步編程的4種方式編程

--自我整理,來自網絡promise

 

1, Callback 回調函數網絡

假設func1() 執行須要較長的時間,而func2() 等待前者的執行結果異步

能夠將func2() 寫成爲 func1() 的回調函數模塊化

Function func1(callback) {異步編程

  setTimeOut(function () {函數

    // Exe a long timespa

    Callback();server

  }, 1000);協程

}

代碼變成 func1(func2)

 

優勢: 簡單,容易寫

缺點: 不利於維護和閱讀,高度耦合,每一個任務只能指定一個回調函數

 

 

2, 事件監聽

採用事件驅動模式,任務的執行不取決於代碼的順序,而取決於某個時間按是否發生。

Func1.on(「done」, func2)

 

Function func1(){

  setTimeOut( function() {

    // Exe a long time

    Func1.trigger(「done」);

  }, 1000);

}

 

優勢: 容易理解,封裝done,能夠綁定多個事件,去耦合,有利於模塊化

缺點: 整個程序變成事件驅動型,運行流程不清晰

 

 

3,發佈/訂閱

設置一個「信號中心」,某個任務執行完成,向信號中心「發佈」(publish)一個信號,其餘任務能夠向信號中心「訂閱」(subscribe) 這個信號,從而能夠執行。這是 publish-subscribe pattern,又叫觀察者模式(observer pattern)

 

func2能夠向信號中心 」jQuery」 訂閱」done」信號。

jQuery.subscribe(「done」, func2);

 

Function func1(){

  setTimeOut(function (){

    // Exe a long time

    jQuery.publish(「done」);

  }, 1000);

}

func1 執行完以後,信號中心發佈done信號,引起func2執行。

 

同時,func2還能夠取消訂閱: jQuery.unsubscribe(「done」, func2)

 

 

 

4, Promises對象

Promises對象是CommonJS工做組提出的一種規範,目的是爲異步編程提供統一接口

思想:每個異步任何返回一個Promise對象,對象有個then方法,容許指定回調函數

Func1().then(func2)

 

Function func1() {

  Var dfd = $.Defered();

  setTimeOut( function() {

    // Exe a long time

    Dfd.resolve();

  }, 1000);

  Return dfd.promise;

}

 

Promise的狀態:pendingfulfilled,和rejected三種狀態,只有兩種轉換(1pending -> fulfilled2, pending->rejected,每種轉換隻能發生一次。

Promisethen方法:then方法用於指定異步事件完成以後的回調函數。

 

還能夠針對鏈式回調 Fun1().then(fuc2).then(func3)

 

5, Generator

除了上面的基於回調函數來實現異步的,還有Generator,最大的特色是能夠產生函數的重啓和暫停,Python的協程Coroutine的實現。

 

 

異步編程存在的問題:

1,異常處理問題

回調異步事件包括兩個部分:異步請求和結果處理。那麼對於異常,須要分開處理。

 

Promise實現異常的傳遞,好處是保證代碼不被阻塞,但由於其能承擔多個異步事件的緣由,較難找出異步事件出現異常的緣由。

相關文章
相關標籤/搜索