Advertisement

Promise.then()的两个参数是什么,分别是干什么的?第二个参数和catch的区别

阅读量:

在今天的面试中被询问了关于 Promise.then() 的两个参数及其作用。由于平时很少使用该方法,在学习过程中并未给予过多关注。因此,在之后的时间里我会 dedicatedly 学习并掌握这一知识点。

首页我们先要区分几个概念:

  1. reject用于触发错误并丢弃后续代码执行路径;而catch用于捕获错误并允许后续代码继续执行。
  2. reject作为Promises的一个方法被调用时会触发错误;另一方面,则有then和catch两个方法分别用于捕获成功结果或错误情况。

核心区别在于,在第一个函数内部触发了一个异常事件后,该事件无法被其后续定义的catch块捕捉到。此外,在处理异常时,默认情况下catch块遵循就近原则操作:如果两个catch块同时存在,则仅前一个catch块能够捕捉到该异常;若前一个catch块未被定义,则后一个catch块负责捕捉该异常。

复制代码
    const p = new Promise((resolve, reject)=>{
      resolve()  //抛出成功时的结果
    })
    
    p.then((res)=>{
      throw new Error('hello');
    }).then(()=>{},(err2)=>{
      console.log(err2,'err2')
    }).catch((err1)=>{
      console.log(err1,'err1')
    })   //图1第一行所示错误,err2会捕获到错误
    
    p.then((res)=>{
      throw new Error('hello');
    }).catch((err1)=>{
      console.log(err1,'err1')
    }) //图1第二行所示错误,没有then,catch捕获异常
在这里插入图片描述
复制代码
    const p = new Promise((resolve, reject)=>{
      reject('你错啦~~')
    })
    
    p.then((res)=>{
      throw new Error('hello');
    },(err2 => {
      console.log(err2,'err2')
    })).catch((err1)=>{
      console.log(err1,'err1')
    })  //图2第一行,then的第二个参数捕获异常
    
    p.then((res)=>{
      throw new Error('hello');
    }).catch((err1)=>{
      console.log(err1,'err1')
    })// 图2第二行,catch捕获异常
在这里插入图片描述

建议一直用catch来捕获异常

原因在于catch能够捕获当then方法执行时可能出现的错误,并且这种处理方式更为贴近同步编程的习惯(try/catch)。因此,在设计同步流程时建议优先采用catch机制而非将then用于捕获异常的位置。

原因在于catch能够捕获当then方法执行时可能出现的错误,并且这种处理方式更为贴近同步编程的习惯(try/catch)。因此,在设计同步流程时建议优先采用catch机制而非将then用于捕获异常的位置。

复制代码
    // bad
    promise
      .then(function(data) {
    // success
      }, function(err) {
    // error
      });
    
    // good
    promise
      .then(function(data) { //cb
    // success
      })
      .catch(function(err) {
    // error
      });

全部评论 (0)

还没有任何评论哟~