1.promise是什么
promise对象拥有一个叫做状态的属性,该属性不受外界影响,修改后不能再次变化。而Promise是一个构造函数,可以生成promise对象。
2.promise的构造方法
resolve,reject,race,all四个方法都会返回一个promise。
resolve:resolve接受一个值或是promise对象,如果接受的是promise对象,会直接返回该promise对象,否则返回完成状态的promise对象
reject:类似resolve,返回的是拒绝状态的promise
all:接受一个数组,分为三种情况
- 传入空数组,返回完成状态的promise
- 传入的数组中没有promise,返回异步完成的prmise
- 传入的数组中有promise,返回处于pending状态的promise对象,在数组中的promise都成功或者有一个失败时,变成完成状态或拒绝状态
race:同all有点接近,在某个promise完成后,返回该值,根据状态来决定返回的是完成状态还是拒绝状态的promise
如果传入的是空数组,返回的promise永远是等待
3.promise对象的方法
then:
then接受两个参数,返回一个promise。第一个参数是promise在成功的情况下的回调函数,第二个参数是失败情况下的(可选)。
- 如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
- 如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
- 如果then中的回调函数返回一个已经是接受状态的Promise,那么then返回的Promise也会成为接受状态,并且将那个Promise的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
- 如果then中的回调函数返回一个已经是拒绝状态的Promise,那么then返回的Promise也会成为拒绝状态,并且将那个Promise的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
- 如果then中的回调函数返回一个未定状态(pending)的Promise,那么then返回Promise的状态也是未定的,并且它的终态与那个Promise的终态相同;同时,它变为终态时调用的回调函数参数与那个Promise变为终态时的回调函数的参数是相同的。
catch:
跟Promise.prototype.then(undefined, onRejected)一致
4.promise的优缺点
优点:
- 跟callback相比,避免的回调地域无限嵌套,可以使用链式写法
- 约束了异步处理的写法
- 便于捕捉错误
缺点:
- 无法取消promise
- 无法处理多次触发的事件
- 无法获取当前执行的进度信息
注意:一些情况下可以使用Promise.race来取消promise。比如设置异步请求在三秒不成功的话取消,可以在Promise.race的第二个参数加一个三秒的定时器。
Reference:
http://hpoenixf.com/posts/10947/
https://github.com/mqyqingfeng/Blog/issues/98
http://es6.ruanyifeng.com/#docs/promise#Promise-all