異步編程的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的狀態:pending,fulfilled,和rejected三種狀態,只有兩種轉換(1,pending -> fulfilled, 2, pending->rejected),每種轉換隻能發生一次。
Promise的then方法:then方法用於指定異步事件完成以後的回調函數。
還能夠針對鏈式回調 Fun1().then(fuc2).then(func3)
5, Generator
除了上面的基於回調函數來實現異步的,還有Generator,最大的特色是能夠產生函數的重啓和暫停,Python的協程Coroutine的實現。
異步編程存在的問題:
1,異常處理問題
回調異步事件包括兩個部分:異步請求和結果處理。那麼對於異常,須要分開處理。
Promise實現異常的傳遞,好處是保證代碼不被阻塞,但由於其能承擔多個異步事件的緣由,較難找出異步事件出現異常的緣由。