【问题标题】:Promises : go to next error function [duplicate]承诺:转到下一个错误函数[重复]
【发布时间】:2016-03-04 06:19:09
【问题描述】:

如何使用 Promise 链接调用下一个错误函数?
我以为错误函数中的 return 会自动调用下一个错误函数。

//Called in a controller
dataService.saveRequest()
     .then(function result(res){
        //Logged when the service sends back a result
        console.log("finished");
     }, function error(error){
        //Logged when the service sends back an error
        //THIS DOES NOT GET CALLED
         console.log("error from controller");
     });

//INSIDE THE SERVICE
this.saveRequest = function(){
   return $http.post('rest/request/send-request', someData)
       .then(function(result){
         //Goes, as expected, into the success function in the controller
         return result.data;
       }, function(error){
          //Does NOT go into the next error function
          //I need the error function to execute in the controller
           return error;
       });

};

【问题讨论】:

    标签: javascript angularjs promise


    【解决方案1】:

    我在error函数里面强硬一个return会自动调用下一个error函数。

    不,返回意味着您从错误情况中恢复,接下来将解决成功回调。如果你从错误回调中返回并且你想将它传递给链中的下一个,你需要返回被拒绝的承诺:

    dataService.saveRequest()
     .then(function result(res) {
        //Logged when the service sends back a result
        console.log("finished");
     }, function error(error) {
         console.log("error from controller");
         return $q.reject('error from controller');
     });
    

    或者相反,或者返回你可以throw 一些东西。

    【讨论】:

      【解决方案2】:

      当您从处理程序返回值而不是 Promise 时,它​​会隐式地用 Promise.resolve 包装。这也适用于拒绝处理程序,因此您的拒绝处理程序返回一个 resolved 承诺。

      您需要 throw 或返回一个被拒绝的 Promise 来传播拒绝:

      return $http.post('rest/request/send-request', someData)
         .then(function(result){
           //Goes, as expected, into the success function in the controller
           return result.data;
         }, function(error){
             throw error;
         });
      

      【讨论】:

        【解决方案3】:

        你必须从一个承诺中返回return $q.reject();,这样链中的下一个承诺也会失败。查看示例 plunker:http://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p=preview

        原因是:您的错误处理程序可能会采取措施纠正错误。在您的错误函数中,您处理错误,如果未另行指定,它将返回一个已解决的新承诺。因此,让下一个承诺默认失败是不合理的。把它想象成 try/catch。

        您正在捕获错误并对其进行处理 - 因此它会到达成功处理程序。如果你想拒绝它,你必须通过返回 $q.reject(); 来做到这一点

        【讨论】:

          猜你喜欢
          • 2018-01-06
          • 1970-01-01
          • 2020-04-22
          • 2015-05-07
          • 1970-01-01
          • 1970-01-01
          • 2016-12-06
          • 1970-01-01
          • 2014-11-18
          相关资源
          最近更新 更多