javascript Promise
Promise
回调函数真正的问题在于它剥夺了我们使用return和throw这些关键字的能力,而Promise很好地解决了这一切。
Promise,就是一个对象,用来传递异步操作的消息。他代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的API,可供进一步处理。
Promise特点:
1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfiled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
2.一旦状态改变,就不会再变,任何时候得到的都是这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会在变,会一直保持这个结果。就算再对Promise对象添加回调函数,也会立即得到这个结果。
有了Promise对象,就可以将异步操作已同步操作的流程便打出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,是的控制异步操作更加容易。
Promise也有缺点:无法取消Promise,一旦信件她就会立即执行,无法中途取消,其次,如果不设置回调函数,Promise内部将抛出错误,不会反映到外部,第三,当处于Pending时,无法得知目前进展到哪一阶段(刚刚开始还是即将完成)。
var promise = new Promise(function(resolve,reject){ if(/*异步操作成功*/){ resolve(value); }else{ reject(error); } }); promise.then(function(value) { //success }, function(value) { //failure });
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve方法和reject方法。
如果异步操作成功,则用resolve方法将Promise对象的状态,从未完成变为完成。
基本api
1.Promise.resolve()
2.Promise.reject()
3.Promise.prototype.then()
4.Promise.prototype.catch()
5.Promise.all() //所有的完成
var p = Promise.all([p1,p2,p3]);
6.Promise.race() //竞速,完成一个即可
进阶
promise的奇妙在于给与我们以前的return和throw,每个Promise都会提供一个then()函数和一个catch(),实际上是then(null,...)函数
somePromise().then(function(){ //do something });
我们可以做三件事,
1.return另一个Promise
2.return一个同步的值(或者undefined)
3.throw一个同步异常 throw newError('');