promise的常用API和常用属性
-
Promise构造函数:
new Promise((resolve, reject)=>{ })
,resolve()表示成功,接下来执行promise实例的then方法中的第一个函数;reject表示失败,执行promise实例的then方法中的第二个函数或者catch。 -
.then方法:有两个参数,第一个是promise的状态从等待状态变为成功状态之后执行的函数;第二个参数是promise的状态从等待状态变为失败状态之后执行的函数。会返回一个新的promise对象。
-
.catch方法:有一个参数,promise执行发生异常时,会执行.catch中的代码,效果相当于.then方法中的第二个参数。区别就是:在.then的第一个函数参数中的执行代码发生了异常,.then的第二个函数参数是捕获不到的,但是.catch中能捕获到;若.then中的第二个参数和.catch都存在,出现错误后捕获时会采取就近原则,即如果promise内部报错,reject抛出错误或者
throw new Error()
后,会在.then中的第二个参数中捕获到,.catch中捕获不到。示例如下:
const promise = new Promise((resolve, rejected) => { throw new Error('test'); }); //此时只有then的第二个参数可以捕获到错误信息 // Error: test..1 promise.then(res => { // }, err => { console.log(err + "..1"); }).catch(err1 => { console.log(err1 + "..2"); }); //此时catch方法可以捕获到错误信息 // Error: test..2 promise.then(res => { // }).catch(err1 => { console.log(err1 + "..2"); }); //此时只有then的第二个参数可以捕获到Promise内部抛出的错误信息 // Error: test..1 promise.then(res => { throw new Error('hello'); }, err => { console.log(err + "..1"); }).catch(err1 => { console.log(err1 + "..2"); }); //此时只有then的第二个参数可以捕获到Promise内部抛出的错误信息 // Error: test..1 promise.then(res => { throw new Error('hello'); }, err => { console.log(err + "..1"); }); //此时catch可以捕获到Promise内部抛出的错误信息 // Error: test..2 promise.then(res => { throw new Error('hello'); }).catch(err1 => { console.log(err1 + "..2"); }); // 从以上例子可看出,若promise内部抛出错误,同时.then中的第一个参数也抛出错误,.then的第二个参数和.catch中都只能捕获到promise内部的错误,即promise内部抛出错误的优先级大于.then的第一个参数中抛出的错误 const promise = new Promise((resolve, rejected) => { resolve('test'); }); //此时只有catch中可以捕获到.then第一个参数中抛出的错误信息 // Error: hello..2 promise.then(res => { throw new Error('hello'); }, err => { console.log(err + "..1"); }).catch(err1 => { console.log(err1 + "..2"); }); //此时then的第二个参数不能捕获到.then第一个参数中抛出的错误信息 // 没有输出内容,promise实例会返回一个reject promise.then(res => { throw new Error('hello'); }, err => { console.log(err + "..1"); }); //此时catch可以捕获到.then第一个参数中抛出的错误信息 // Error: hello..2 promise.then(res => { throw new Error('hello'); }).catch(err1 => { console.log(err1 + "..2"); }); // 从以上例子可看出,若promise内部没有抛出错误,而在.then中的第一个参数抛出错误,.then的第二个参数是捕获不到这个错误的,只有.catch中能捕获到。
-
resolve():返回一个成功的promise对象。
-
reject():返回一个失败的promise对象。
-
all():参数是一个数组,数组元素都是promise的实例,只有当数组中的promise实例都返回成功后,才会执行.then中的第一个函数参数,只要有一个失败,就会执行.then中的第二个函数参数或者.catch中的代码。用法如下:
let a = new Promise((resolve, reject) => { resolve('成功了') }) let b = new Promise((resolve, reject) => { resolve('success') }) let c = Promse.reject('失败') Promise.all([a, b, c]).then((arr)=>{}).catch((e)=>{})
-
race():参数和all()一样,也是一个数组,数组元素是promise的实例,用法也与all()一致,不同的是,它的结果取决于参数中先执行完的promise返回的结果,如果第一个执行完的promise实例返回结果是成功,那么race()就返回成功;如果第一个执行完的promise实例返回结果是失败,那么race()就返回失败。
注: 1、.then和.catch是Promise实例的方法;resolve、reject、all、race都是Promise的方法 2、.catch就是then()的语法糖,实质上还是执行的promise的then方法,即,.catch((e)=>{})相当于.then(undefined, (e)=>{})