一、js 中异步编程的四种方式
1.回调函数
- 优点:简单、容易理解和部署
- 缺点:不利于代码的阅读和维护,各个部分之间高度耦合,流程会很混乱,而且每个任务只能指定一个回调函数
function fn1(callback) {
callback();
}
2.事件监听
- 优点:容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,可以去耦合,实现模块化
- 缺点:整个程序都要变成事件驱动型,运行流程会变得很不清晰(此处感悟不深)
//采用 jquery 的写法
function f1(){
...
//发送done事件完成,相当于触发事件
f1.trigger('done');
}
//done 为监听的事件名字
f1.on('done', f2);
3.发布/订阅
- 优点:可以通过查看"消息中心",了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行
//采用的是Ben Alman的Tiny Pub/Sub,这是jQuery的一个插件
//f2向"信号中心"jQuery订阅"done"信号
jQuery.subscribe("done", f2);
function f1(){
//向"信号中心"jQuery发布"done"信号,从而引发f2的执行
jQuery.publish("done");
}
//f2完成执行后,也可以取消订阅(unsubscribe)
jQuery.unsubscribe("done", f2);
4.Promises对象
- Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口
- 每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数
f1().then(f2);
//f1要进行如下改写(这里使用的是jQuery的实现)
function f1(){
var dfd = $.Deferred();
setTimeout(function () {
// f1的任务代码
dfd.resolve();
}, 500);
return dfd.promise;
}
- 优点
- 回调函数变成了链式写法,程序的流程可以看得很清楚,而且有一整套的配套方法,可以实现许多强大的功能。
- 如果一个任务已经完成,再添加回调函数,该回调函数会立即执行。所以,你不用担心是否错过了某个事件或信号
- 缺点:编写和理解,都相对比较难