码迷,mamicode.com
首页 > 其他好文 > 详细

异步编程的模式

时间:2015-02-05 21:51:12      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

一、回调函数

function f1(callback){
    setTimeout(function () {
        // f1的任务代码
        callback();
    }, 1000);
}
f1(f2);

优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),使得程序结构混乱、流程难以追踪(尤其是回调函数嵌套的情况),而且每个任务只能指定一个回调函数。

简单,难维护,高耦合

二、事件监听

事件驱动模式。任务的执行不取决于代码的顺序,而取决于某个事件是否发生

f1.on(‘done‘, f2);
function f1(){
    setTimeout(function () {
        // f1的任务代码
        f1.trigger(‘done‘);
    }, 1000);
}

优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以"去耦合"(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。

可绑多个,事件驱动流程不清晰

三、发布/订阅

如果存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe pattern),又称"观察者模式"(observer pattern)

jQuery.subscribe("done", f2);
function f1(){
    setTimeout(function () {
        // f1的任务代码
        jQuery.publish("done");
    }, 1000);
}
jQuery.unsubscribe("done", f2);

与"事件监听"类似,但是明显优于后者。因为我们可以通过查看"消息中心",了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行

有消息中心

四、promise

Promises:对象,代理(异步与同步的中介)

思想:每一个异步任务立刻返回一个Promise对象,由于是立刻返回,所以可以采用同步操作的流程。这个Promises对象有一个then方法,允许指定回调函数,在异步任务完成后调用

(new Promise(f1)).then(f2);

使用正常的程序流程(同步),来处理异步操作

promise接口:三种状态:未完成(pending)、已完成(fulfilled)、失败(rejected)。这三种的状态的变化途径只有两个,且只能发生一次:从“未完成”到“已完成”,或者从“未完成”到“失败”。一旦当前状态变为“已完成”或“失败”,就意味着不会再发生状态变化了

(new Promise(step1))
.then(step2)
.then(step3)
.then(step4)
.then(console.log, console.error);  //Promises对象的错误有传递性

promise对象的实现没看。

一个任务已完成,再加回调,会立即执行。  

异步编程的模式

标签:

原文地址:http://www.cnblogs.com/wang-jing/p/4275965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!