一、js 中異步編程的四種方式
1.回調函數(shù)
- 優(yōu)點:簡單、容易理解和部署
- 缺點:不利于代碼的閱讀和維護,各個部分之間高度耦合侠坎,流程會很混亂,而且每個任務只能指定一個回調函數(shù)
function fn1(callback) {
callback();
}
2.事件監(jiān)聽
- 優(yōu)點:容易理解裙盾,可以綁定多個事件实胸,每個事件可以指定多個回調函數(shù),可以去耦合番官,實現(xiàn)模塊化
- 缺點:整個程序都要變成事件驅動型童芹,運行流程會變得很不清晰(此處感悟不深)
//采用 jquery 的寫法
function f1(){
...
//發(fā)送done事件完成,相當于觸發(fā)事件
f1.trigger('done');
}
//done 為監(jiān)聽的事件名字
f1.on('done', f2);
3.發(fā)布/訂閱
- 優(yōu)點:可以通過查看"消息中心",了解存在多少信號鲤拿、每個信號有多少訂閱者假褪,從而監(jiān)控程序的運行
//采用的是Ben Alman的Tiny Pub/Sub,這是jQuery的一個插件
//f2向"信號中心"jQuery訂閱"done"信號
jQuery.subscribe("done", f2);
function f1(){
//向"信號中心"jQuery發(fā)布"done"信號近顷,從而引發(fā)f2的執(zhí)行
jQuery.publish("done");
}
//f2完成執(zhí)行后生音,也可以取消訂閱(unsubscribe)
jQuery.unsubscribe("done", f2);
4.Promises對象
- Promises對象是CommonJS工作組提出的一種規(guī)范宁否,目的是為異步編程提供統(tǒng)一接口
- 每一個異步任務返回一個Promise對象,該對象有一個then方法缀遍,允許指定回調函數(shù)
f1().then(f2);
//f1要進行如下改寫(這里使用的是jQuery的實現(xiàn))
function f1(){
var dfd = $.Deferred();
setTimeout(function () {
// f1的任務代碼
dfd.resolve();
}, 500);
return dfd.promise;
}
- 優(yōu)點
- 回調函數(shù)變成了鏈式寫法慕匠,程序的流程可以看得很清楚,而且有一整套的配套方法域醇,可以實現(xiàn)許多強大的功能台谊。
- 如果一個任務已經完成,再添加回調函數(shù)譬挚,該回調函數(shù)會立即執(zhí)行锅铅。所以,你不用擔心是否錯過了某個事件或信號
- 缺點:編寫和理解减宣,都相對比較難
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者