Promise(四)

catch方法

  1. 当executor抛出异常时,catch方法也会捕获异常(throw new Error( ))

  2. 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'
  3. 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. (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)

  1. 定义: 调用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 协议 ,转载请注明出处!