Javascript 角度';s$q.reject()与DEREFERED.reject()的比较

Javascript 角度';s$q.reject()与DEREFERED.reject()的比较,javascript,angularjs,promise,Javascript,Angularjs,Promise,我正在尝试处理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,

我正在尝试处理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()
    之间有什么区别?什么时候使用
  • 延迟的.promise.then(successFn,errorFn)
    中的
    errorFn
    延迟的.promise.catch(catchFn)
    中的
    catchFn
    之间有什么关系
  • 如果我有一堆嵌套的承诺,并且发生了错误,是否会始终调用最外层的
    catch()
    函数?如果其中一个嵌套承诺还定义了catch函数,该怎么办?那个捕获会阻止最外层的捕获执行吗

  • 谢谢。

    好的,这是我的承诺

  • $q.reject(reason)
    返回拒绝的承诺,其中原因作为参数传递并延迟。拒绝拒绝已延迟的现有对象,无论其进程是否已完成

  • errorFn
    在承诺被拒绝时启动,其参数是拒绝承诺的原因。当允诺过程中的错误没有得到正确处理,导致允诺引发异常而未被拒绝或履行时,调用Catch

  • 您不应该有嵌套的承诺,您应该有链式承诺,在这种情况下,如果没有指定其他块来处理它,则最新的catch块应该捕获它之前的所有内容

  • 1)
    $q.reject()
    是一种快捷方式,可以创建一个延迟的,然后立即拒绝它;如果我不能处理错误,我经常在错误fn中使用这个

    2) 没有什么,
    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
        });
    

    谢谢你简洁的回答。它们非常清楚。但仍然停留在第二位。假设您的示例代码在对then()的调用中同时提供了successFn和errorFn。现在,catchFn将在什么情况下运行?我将答案更新为2)。catch方法与then函数的第二个参数完全相同。promise.catch(errorFn)与promise.then(null,errorFn)相同。如果有人想进一步了解何时使用
    $q
    ,我发现这篇文章对#2非常有帮助,你看我是否成功了fn或errorFn,并且我抛出了一个新错误(…),那么catchFn将运行吗?我的理解是,情况并非如此。可以是在处理程序中,也可以是在过程中。在这个过程中,它肯定会被抓住,但我认为hanlder-toothe的事情是,在这个过程中,可能会发生错误,阻止承诺向任何状态过渡,因此catch块用于检测这些错误,例如,如果您的进程执行除法,并且您尝试将其除以0,则会引发异常,如果未缓存和处理该异常,该异常将自动退出该进程。捕快会得到这个,并采取相应的行动。也许我会说出我的问题,因为我认为这是正确的行为