Angular的$ q.reject()vs deferred.reject()

我试图得到Angular $q服务及其相关对象和API的处理。 当我看我的控制台中的对象时,我看到:

 var deferred = $q.defer() ...(and then from console inspection)... $q: Object {defer: function, reject: function, when: function, all: function} deferred: Object {resolve: function, reject: function, notify: function, promise: Object} deferred.promise: Object {then: function, catch: function, finally: function} 

它提出了几个问题:

  1. $q.reject()deferred.reject()什么区别? 何时使用每个?
  2. deferred.promise.then(successFn, errorFn)catchFndeferred.promise.catch(catchFn)catchFn之间的关系是什么?
  3. 如果我有一堆嵌套的承诺,并发生错误,将最外面的catch()函数总是被调用? 如果其中一个嵌套的承诺也有一个catch函数定义呢? 该捕获是否会阻止最外层的catch执行?

谢谢。

1) $q.reject()是创build延迟的快捷方式,然后立即拒绝它; 如果我无法处理错误,我经常在错误中使用它。

2)Nothing, promise.catch(errorFn)只是promise.catch(errorFn) promise.then(null, errorFn)语法糖,就像$http服务的成功和错误方法一样,所以你可以编写如下的代码:

 promise. then(function(result){ // handle success return result; }, function errorHandler1(error){ // handle error, exactly as if this was a separate catch in the chain. }).catch(function errorHandler2(error){ // handle errors from errorHandler1 }); 

3)这正是$ q.reject可以派上用场的地方:

 promise. catch(function(error){ //Decide you can't handle the error return $q.reject(error); //This forwards the error to the next error handler; }).catch(function(error){ // Here you may handle the error or reject it again. return 'An error occurred'; //Now other errorFn in the promise chain won't be called, // but the successFn calls will. }).catch(function(error){ // This will never be called because the previous catch handles all errors. }).then(function(result){ //This will always be called with either the result of promise if it was successful, or //'An error occured' if it wasn't }); 

好的,这是我承诺的承诺。

  1. $q.reject(reason)返回一个被拒绝的承诺,理由是作为参数被传递并被攻击。 拒绝拒绝一个存在的过程是否已经完成。

  2. 当承诺被拒绝时, errorFn被启动,它的参数就是被拒绝的原因。 当承诺过程中的错误没有得到正确处理导致承诺提高和exception,而不是被拒绝或履行时,Catch被调用。

  3. 你没有嵌套的承诺,你应该有链接的承诺,在这种情况下,最新的catch块应该捕获所有的东西,如果没有其他块被指定来处理它。