1.Promise是异步编程的解决方案,比传统的回调函数和事件要合理强大。
简单的讲,Promise就是一个容器,包含了未来某时刻才会结束的事件。
有两个特点
(1).状态不受外界影响。Promise对象有三种状态pending(进行中),fulfilled(已成功),rejected(已失败)。只有异步操作的结果能决定是那种状态,而且状态一旦确定就没法在改变。
(2).状态改变后不会再次改变,且任何时候都能拿到这个结果。Promise对象的状态改变只会有两种情况,从pending变成fulfilled,或者是从pending变成rejected,只要这两种情况发生了,状态就固定了,成为resolved(已定型)
Promise接收一个函数作为参数,这个函数的两个参数分别是resolve和reject,它们是两个函数,有js引擎提供,不用自己部署。
resolve和reject这两个函数的作用都是讲异步操作的结果,作为参数传递出去,只不过前者是fulfilled状态时,后者是rejected状态时。
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
}).then(res => {
//resolve时的回调
}).catch(res => {
//reject时的回调
}).finally(() => {
//不过异步操作结果如何都会执行,因此不接受任何传入参数,所以无法知道异步操作结果的状态
});
Promise实例具有then方法,接收两个then方法作为参数,第一个是状态为resolved的回掉函数,第二个是状态为rejected的回到函数,第二个可选。
then方法返回的是一个新的Promise实例,所以可以采用链式写法。
catch()是第二个then方法,即状态为rejected回调方法的别名。异步操作抛出错误,会被catch捕获,如果then方法出错也会被catch捕获。Promise对象的错误具有‘冒泡’性质,会一直向后传递,直到被捕获位置,也就是错误1一定会被下一个catch方法捕获。
2.Promise.all()方法用于多个Promise实例,包装成一个新的Promise实例。
const p = Promise.all([p1,p2,p3])
Promise.all()方法接收一个数组作为参数,参数1也可以不是数组,但是必须具有Iterator接口,且每个成员都是Promise实例。
(1).只有p1,p2,p3的状态都变成fulfilled,p的状态才会变成fulfilled,这是p1,p2,p3的返回值组成一个数组,返回到p的回调函数中。
(2).p1,p2,p3中有一个变成rejected状态,p的状态就变成rejected状态,此时第一个进入rejected状态的实例的结果,会传到p的回调函数中。
只有当上面两种情况满足,才会进入p的回调函数中继续执行。
另外如果作为参数的Promise实例定义了catch方法,一旦它被rejected不会触发Promise.all()的catch方法。如果没有定义catch方法,才会触发Promise.all()的catch方法。
3.Promise.race() 同样是将多个Promise实例包装成一个Promise实例。
const p = Promise.race([p1,p2,p3])
区别在于p1,p2,p3中只要有一个实例状态改变,则p的状态也随之改变,首先改变的Promise实例的返回值,则会传入到p的回调函数中。其余据Promise.all()方法基本一样。
4.Promise.resolve() 将参数转变成Promise实例
5.Promise.reject()方法也是将参数转变成Promise实例,只不过区别在于,该实例的状态已经确定,为rejected.
6.Promise.try()
当不知道或者不想去分某个函数是同步执行还是异步执行时,还想使用Promise来处理,就可以使用Promise.try()方法。
Promise.try(() => {
//some code
}).then(() => {
}).catch(() => {
})
这种情况下就能使用Promise.catch()方法捕获所有的同步和异步的错误。