【问题标题】:Error handling in promises with catch使用 catch 处理 Promise 中的错误
【发布时间】:2014-11-09 17:24:23
【问题描述】:

我有一个关于 $q 承诺中的错误处理的问题。下面的代码不适用于处理通过受控拒绝或通过 $q 解决的承诺之外的错误。这意味着,如果错误在代码中的任何地方抛出并且未被拒绝,则 catch 块将不会触发。有没有另一种方法可以让 catch 能够捕捉到任何错误?我知道调用可以放在 try catch 中,但我想知道是否有办法使 $q catch 的行为类似于常规的 javascript catch。

angular.module('myTest',[]).controller('myController',function($q){

    function someService(){
      var deferred = $q.defer();
      throw 'error';
      deferred.resolve({});
      return deferred.promise;
    } 

    someService().then(function(obj){
       console.log('then');
    }).catch(function(e){
      console.log(e);
    });

});

我唯一的希望是处理所有错误来做这样的事情吗:

try
{
someService().then(function(obj){
   console.log('then');
});
}
catch(e){
  console.log('an error happened ' + e);
}

她的用例是我在 someService() 中调用另一个服务,这引发了一个我无法控制的错误,我无法确保该承诺被拒绝。

为什么 $q 承诺没有在内部封装在 javascript try catch 中以保证所有错误都可以被处理。

【问题讨论】:

    标签: javascript angularjs angular-promise


    【解决方案1】:

    当服务抛出错误时,您需要添加显式拒绝语句。

    var deferred =  $q.defer();
    someService().then(function(obj){    
          deferred.resolve(obj):
       })
     .error(function(e){
        deferred.reject(e);
      });
    
     return deferred.promise;
    

    【讨论】:

    • 这里的问题是我调用的服务并没有拒绝承诺,所以错误子句不会在这里触发。
    • 如果您调用的服务不在您的范围内并且在发生错误时不会拒绝,那么这是一个问题,因为调用者必须永远等待。
    • 作为一种变通方法,您可以使用几秒钟的超时来拒绝承诺。
    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 2014-06-21
    • 2019-02-17
    • 2015-06-19
    • 2018-10-29
    • 2019-01-05
    • 2016-04-20
    • 2016-06-08
    相关资源
    最近更新 更多