对于promise对象的介绍有全面的文档支持,十分适合初学者学习:
阮一峰的es6入门
Promise特点###
- promise新建后会立即执行,resolve/reject执行哪一个是需要我们判断的
- 回调函数一旦执行,表明状态要么Resolved,要么Rejected。该promise对象已经定型,再调用回调只会返回既定结果
- 如果异步操作异常,状态就会变成rejected
SetTimeout的第三个参数###
其中文档的第一个例子,此处的setTimeout()有3个参数,代码可知,timeout()返回一个promise对象,并且在ms之后执行setTimeout,setTimeout的第三个参数作为resolve的参数传入:
Resolve/Reject参数###
node中运行如下代码,这里需要注意:在promise对象中resolve()的参数,会被传递给回调函数,即图中的res.success和result
异步操作嵌套###
如下图示,p1p2都为promise对象,但p1是p2的resolve参数,p2会等待p1有结果后执行
。现在对于p2两种结果的回调函数都存在,当不存在reject的回调时,会转入catch中,进行捕获
Promise的链式调用###
promise的then会返回一个新的promise对象,故其可以链式调用,下图可见,500ms的定时任务,resolved被传入第一个then(),其后返回了resolvedprom1,在由第二个then()输出结果
Promise中的catch()###
- 回调执行错误,状态变成reject,会执行catch。then()里抛出异常也会执行catch
- 一旦状态改变完成,再抛出异常就不会被catch
- Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止
- Promise对象抛出的错误不会传递到外层代码,只能用catch来捕捉
- catch()中还能再抛出错误,但不会被自己捕获
Catch的链式调用###
catch()返回的也是一个promise对象,故catch后面可以链式调用then()方法,不过catch只能捕获自己之前的异常,下图中第一个catch就没有捕获到异常
Promise.all()###
- promise.all()可接受一个数组为参数,每个元素为promise对象,类似于与运算,只有所有promise状态都为resolve时,Promise.all()才会执行resolve
- 如果有promise等待,Promise.all()亦会等待
Promise.race()###
与promise.all()相反,只要有一个promise状态改变,就会立即返回给promise.race(),<u>该promise的返回值会传递给回调函数</u>
若干Promise.resolve()###
一般用promise.resolve()将现有对象转为Promise对象,几种情况如下
![]57B4.png](http://upload-images.jianshu.io/upload_images/1759843-66624864e20b0ac0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
若干Promise.reject()###
promise.reject()也会返回一个promise对象,原理同上。不同的部分:对thenable的对象调用reject()后不会执行其then()方法,图中返回的e即为thenable对象
done()和final()的实现
- done():promise对象内部错误不会冒泡至全局,因为catch()、then()返回的都是promise对象,故最后一个总有可能无法捕获,done()就是为了处理这种情况
- final():无论promise的结果如何都会执行,promise在reject之后只会调用一次回调,后续的then中的reject不会执行,final()是用于处理该种情况
~
最后附上demo链接:https://github.com/LiuYashion/ECMAScript6/