Promise对象

129 阅读3分钟

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到该错误。