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编译转化也是可以的。
先用一个图说明下什么原理:
看上去很复杂,其实就是(三个状态的流转):
分别对应流转,有两个预定义处理句柄:
以下摘自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.
示范代码:
|
|
后面再写下在具体开发中如何使用Promise。