1.promise的含义及特点
promise首先就是承诺的意思,承诺以后会做什么事。
有三个状态:进行中(pending)、已成功(resolved)、已失败(rejected)。
状态不可逆:首先进入pending状态,然后进入成功或失败状态,但是状态一旦改变就不可再改变,也不可逆。
状态有效性:就算状态改变已经发生,再对Promise对象添加回调函数,也可以立即获得这个结果。这与事件监听有很大区别,事件监听是一旦错过了事件,再去监听,是得不到结果的。
2.基本用法:
var promise = new Promise((resolve,reject) => {})
Promise构造函数接受一个函数作为参数,该函数又有两个函数作为参数(resolve,reject),这两个函数由js引擎提供,无需自己部署,它们都可以带参数,这个参数会传给回调函数(作为回调函数的参数)。
Promise新建后,它的参数函数就会立即执行,而且调用resolve和reject都不会终止函数的进行(所以比较推荐return resolve()这么使用)。
特例,当p1、p2都是Promise实例,且p2的resolve的参数为p1时:
var p1 = new Promise((resolve,reject) => {
...
})
var p2 = new Promise((resolve,reject) => {
resolve(p1)
})
p2的状态将会无效,最后的状态将由p1决定,传出来的参数值也是p1传出来的。
3.Promise.prototype.then()
Promise实例具有then方法,两个参数,分别是Resolved的回调函数和Rejected的回调函数。返回的是一个新的Promise实例,注意,不是原来那个实例。
如果then的成功回调函数,返回的是一个Promise,那么then返回的就是这个promise,如果返回的是一个普通值,则then返回的是一个已经resolved的promise,而那个普通值则作为resolve的参数。
4.Promise.prototype.catch()
catch方法是.then(null,rejection)的一个别名,专门用来指定错误回调的。
相比于then的好处是,无论是promise的立即执行函数中抛出错误还是then的成功回调函数中抛出错误,都能被catch捕获。
reject操作等同于抛出错误,所以resolved之后再抛出错误便无法被捕获,因为promise的状态无法再改变。 promise的错误具有冒泡性,会一直向后传递直到被catch,个人理解在源码实现上,被跳过的then,其实是返回了一个已rejected的promise,然后将该错误数据通过参数一直向后传递。
同then一样,catch返回的也是一个promise,没有报错则会跳过catch方法,同样个人认为,其实是返回了一个resolved的promise。
桶then一样,catch的失败回调函数中返回了一个promise,那么catch返回的就是这个promise,如果返回的是一个普通值,则catch返回的是一个已经resolved的promise,而那个普通值则作为resolve的参数。
与传统try,catch代码块不一样,即使没有catch,promise对象抛出的错误也不会传递到外层代码块。
5.Promise.all(),Promise.race()
用法很简单:
var p = Promise.all([P1,P2,P3])
// p、p1、p2、p3均为promise对象
all:p1、p2、p3都成功则p成功,有一个失败则p失败,成功时参数为P1、P2、P3传值的数组,失败就失败的那个一的参数值。
race:p1、p2、p3有一个率先改变,p就改变。
6.关于try catch
try catch嵌套,内层catch了错误,外层将不会再次catch到该错误。