Promise错误处理

一、Promise中then中两个回调和用catch捕获错误的区别  https://blog.csdn.net/qq_41968486/article/details/123544784

1. 区别

  主要区别就是,如果在then的第一个函数里抛出了异常,后面的catch能捕获到,而then的第二个函数捕获不到。

  • then的第二个参数和catch捕获错误信息的时候会遵循就近原则。
    如果是promise内部报错,reject抛出错误后,then的第二个参数和catch方法都存在的情况下,只有then的第二个参数能捕获到,如果then的第二个参数不存在,则catch方法会捕获到。来看下面的例子:
    const promise = new Promise((resolve, rejected) => {
        throw new Error('test');
    });
    
    //此时只有then的第二个参数可以捕获到错误信息
    promise.then(res => {
        //
    }, err => {
        console.log(err);
    }).catch(err1 => {
        console.log(err1);
    });
    
    
    //此时catch方法可以捕获到错误信息
    promise.then(res => {
        //
    }).catch(err1 => {
        console.log(err1);
    });
    
    
    //此时只有then的第二个参数可以捕获到Promise内部抛出的错误信息
    promise.then(res => {
        throw new Error('hello');
    }, err => {
        console.log(err);
    }).catch(err1 => {
        console.log(err1);
    });
    
    //此时只有then的第二个参数可以捕获到Promise内部抛出的错误信息
    promise.then(res => {
        throw new Error('hello');
    }, err => {
        console.log(err);
    });
    
    
    //此时catch可以捕获到Promise内部抛出的错误信息
    promise.then(res => {
        throw new Error('hello');
    }).catch(err1 => {
        console.log(err1);
    });
    View Code
  • promise内部没有报错,第一个then里面抛出错误,后面的catch能捕获到,而then的第二个函数捕获不到。
    • then里面通过 trow 抛出错误
      const promise = new Promise((resolve, rejected) => {
          resolve('12')
      });
      
      // 此时只有catch可以捕获到错误信息,第二个then回调无法捕获
      promise.then(res => {    throw new Error('23')
      }, err => {
          console.log('1',err);
      }).catch(err1 => {
          console.log('2',err1);
      });
    • then里面通过 return Promise.reject() 返回错误promise。这就是返回一个fail状态的promise对象。
      const promise = new Promise((resolve, rejected) => {
          resolve('12')
      });
      
      // 此时只有catch可以捕获到错误信息,第二个then回调无法捕获
      promise.then(res => {    return Promise.reject('12')
      }, err => {
          console.log('1',err);
      }).catch(err1 => {
          console.log('2',err1);
      });

    总结:promis的then方法第一个回调不管怎样,都是无法进入第二个then回调的。所以推荐用catch捕获。

2. 两个捕获方法的比较

// bad
promise
  .then(function(data) {
    // success
  }, function(err) {
    // error
  });

// good
promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  });

上面代码中,第二种写法要好于第一种写法,理由是第二种写法可以捕获前面then方法执行中的错误,也更接近同步的写法(try/catch)。因此,建议总是使用catch方法,而不使用then方法的第二个参数。

posted @ 2024-06-25 09:18  吴飞ff  阅读(1)  评论(0编辑  收藏  举报