Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有catch的承诺中的错误处理_Javascript_Angularjs_Angular Promise - Fatal编程技术网

Javascript 带有catch的承诺中的错误处理

Javascript 带有catch的承诺中的错误处理,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我有一个关于$q承诺中的错误处理的问题。下面的代码不适用于处理通过受控拒绝或通过$q解决的承诺之外的错误。也就是说,如果错误被抛出到代码中的任何地方并且没有被拒绝,那么catch块将不会触发。有没有其他方法让catch能够捕获任何错误?我知道这个调用可以放在一个try-catch中,但是我想知道是否有一种方法可以让$q-catch表现得像一个普通的javascript-catch angular.module('myTest',[]).controller('myController',func

我有一个关于$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
中,以保证所有错误都可以处理。

当服务抛出错误时,您需要添加一个明确的拒绝语句

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

 return deferred.promise;

这里的问题是,我调用的深层次服务不会拒绝承诺,因此错误条款不会在这里触发。如果您调用的服务不在您的范围内,并且如果发生错误也不会拒绝,那么这是一个问题,因为调用方必须永远等待。作为一种解决方法,您可以使用几秒钟的超时来拒绝承诺。