Promise处理异常

promise如何进行异常处理

  • 参照promise的文档我们可以在reject回调和catch中处理异常。但是promise规定如果一个错误在reject函数中被处理,那么promise将从异常常态中恢复过来。这意味着接下来的then方法将接收到一个resolve回调。大多数时候我们希望发生错误的时候,promise处理当前的异常并中断后续的then操作。

  • 我们先来看一个使用reject处理异常的例子

      var promiseStart = new Promise(function(resolve, reject){
          reject('promise is rejected');
      });
    
      promiseStart
      .then(function(response) {
          console.log('resolved');
          return new Promise(function(resolve, reject){
              resolve('promise is resolved');
          });
      },function (error){
          console.log('rejected1:', error);
          // 如果这里不抛出error,这个error将被吞掉,catch无法捕获异常
          // 但是如果抛出error,这个error会被下一个then的reject回调处理,这不是我们想要的
          throw(error); 
      })
      .then(function (response){
          console.log('resolved:', response);
      },function (error){
          console.log('rejected2:', error);
          throw(error);
      })
      .catch(function(error) {
          console.log('catched:', error);
      })
    
      /* 
      输出:
      rejected: promise is rejected
      rejected: promise is rejected
      catched: promise is rejected
      */
  • 在这个例子中reject回调处理了异常,但是它并不能中断后续then操作。第二个then中的reject被触发了。

  • 而正确的做法是,不要使用reject!让错误直接到catch中捕获。

    var promiseStart = new Promise(function(resolve, reject){
        reject('promise is rejected');
    });

    promiseStart
    .then(function(response) {
        console.log('resolved');
        return new Promise(function(resolve, reject){
            resolve('promise is resolved');
        });
    })
    .then(function (response){
        console.log('resolved:', response);
    })
    .catch(function(error) {
        console.log('catched:', error);
    })

    /* 
    输出:
    catched: promise is rejected
    */

   转载规则


《Promise处理异常》 朝飞 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
leetcode-数组-1-两数之和 leetcode-数组-1-两数之和
1. 两数之和描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 示例 1 给定 nums = [2, 7, 11, 15], target = 9
2020-02-19
下一篇 
理解和使用Promise.all和Promise.race 理解和使用Promise.all和Promise.race
一、Pomise.all的使用 Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。 具体
2020-02-19
  目录