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}
它提出了几个问题:
-
$q.reject()
和deferred.reject()
什么区别? 何时使用每个? -
deferred.promise.then(successFn, errorFn)
的catchFn
与deferred.promise.catch(catchFn)
的catchFn
之间的关系是什么? - 如果我有一堆嵌套的承诺,并发生错误,将最外面的
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 });
好的,这是我承诺的承诺。
-
$q.reject(reason)
返回一个被拒绝的承诺,理由是作为参数被传递并被攻击。 拒绝拒绝一个存在的过程是否已经完成。 -
当承诺被拒绝时,
errorFn
被启动,它的参数就是被拒绝的原因。 当承诺过程中的错误没有得到正确处理导致承诺提高和exception,而不是被拒绝或履行时,Catch被调用。 -
你没有嵌套的承诺,你应该有链接的承诺,在这种情况下,最新的catch块应该捕获所有的东西,如果没有其他块被指定来处理它。