js 中的异步编程

一、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;
}
  • 优点
  • 回调函数变成了链式写法,程序的流程可以看得很清楚,而且有一整套的配套方法,可以实现许多强大的功能。
  • 如果一个任务已经完成,再添加回调函数,该回调函数会立即执行。所以,你不用担心是否错过了某个事件或信号
  • 缺点:编写和理解,都相对比较难
参考:Javascript异步编程的4种方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容