promise设计模式

promise是为了解决Javascript的异步编程导致的‘callback hell’而存在的。

目前有多种设计方式,比较知名的如:promise/deferred(jquery就使用了这个方式),
promise/a+(是es6 promise规范)。

当然我们还是希望使用原生的Promise对象,先看下浏览器的支持度:

可见IE还是重灾区,firefox和chrome很早就已经实现了原生的promise了。当然如果要使用promise,已有不少第三方库的支持,如jquery,Q,Bluebird,Thenjs…
还是比较多的实现,同时值得一提的是推荐使用polyfill的方式来解决,如 es6-promise,或者使用Babel进行es6编译转化也是可以的。

先用一个图说明下什么原理:

promise 原理图

看上去很复杂,其实就是(三个状态的流转):

promise 简单图

分别对应流转,有两个预定义处理句柄:

Promise 处理图

以下摘自MDN的Promise/A+规范说明

属性

Promise.length

长度属性,其值为 1 (构造器参数的数目).

Promise.prototype

表示 Promise 构造器的原型.

方法

Promise.all(iterable)

返回一个promise,当iterable参数里所有的promise都被解决后,该promise也会被解决。

Promise.race(iterable)

返回一个Promise,当iterable参数里的任意一个子Promise被接受或拒绝后,该promise马上也会用子Promise的成功值或失败原因被接受或拒绝。

Promise.reject(reason)

用失败原因reason拒绝一个Promise对象。
Promise.resolve(value)
用成功值value解决一个Promise对象。如果该value为可继续的(thenable,即带有then方法),返回的Promise对象会“跟随”这个value,采用这个value的最终状态;否则的话返回值会用这个value满足(fullfil)返回的Promise对象。

Promise原型

属性

Promise.prototype.constructor

返回创建了实例原型的函数. 默认为 Promise 函数.

方法

Promise.prototype.catch(onRejected)

添加一个否定(rejection) 回调到当前 promise, 返回一个新的promise。如果这个回调被调用,新 promise 将以它的返回值来resolve,否则如果当前promise 进入fulfilled状态,则以当前promise的肯定结果作为新promise的肯定结果.

Promise.prototype.then(onFulfilled, onRejected)

添加肯定和否定回调到当前 promise, 返回一个新的 promise, 将以回调的返回值 来resolve.

示范代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
function asyncFunction() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Async Hello world');
}, 16);
});
}
asyncFunction().then(function (value) {
console.log(value); // => 'Async Hello world'
}).catch(function (error) {
console.log(error);
});

后面再写下在具体开发中如何使用Promise。