Promise(四)
catch方法
当executor抛出异常时,catch方法也会捕获异常(throw new Error( ))
catch的链式调用默认捕获第一个promise的异常,如果第一个promise没有抛出异常并且.then函数中直接返回promise的对象且该对象抛出了异常,则捕获.then函数返回的promise对象异常
let promiseFn=() => { return new Promise((resolve,reject) => {resolve()}) } promiseFn().then( res => new Promise((resolve,reject) => {reject('errr')}) ).catch(err => {console.log(err)}) --> 'errr'
catch方法返回值
定义: 也是返回一个新的promise对象,return的值通过resolve传递,所以.catch return的值 需要通过.then获取let promiseFn=() => { return new Promise((resolve,reject) => { reject() }) } /* promiseFn().catch(res => 3) 这个返回值就是 new Promise( (resolve,reject)=>{ resolve(3) } ) */ promiseFn().catch(res => 3).then(res => {console.log(res)}) --> 3
catch方法补充
- (1) Q: Promise.then( ) 和 Promise.catch( ) 分开调用时为什么会报错?
A: 因为这两个为独立函数,调用时互不影响。promise每次只会返回一个结果, 这样,如果返回的是reject状态,那么.then函数无法处理,就会报错反之也是一样
let promiseFn=() => {
reject('err')
}
/* 无法处理reject的结果,就会报错 */
promiseFn.then( res => {} ) --> 报错
promiseFn.catch( res => {} )
(2) 解决
i. then时,传递成功和失败的两个回调函数
ii. catch的链式调用
promiseFn.then( res => {}, err => {} )
promiseFn.then( res => {} ).catch( err => {})
finally方法(ES9)
- 定义: 调用promise对象后最终都会调用这个方法
let promiseFn=() => {
return new Promise((resolve,reject) => {
reject(22)
})
}
/*
promiseFn().catch(res => 3) 这个返回值就是 new Promise( (resolve,reject)=>{ resolve(3) } )
*/
promiseFn().catch(err =>{}).finally(()=>{
console.log('结束')
})
--> '结束'
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!