链接承诺错误处理程序

时间:2014-03-14 20:53:00

标签: javascript angularjs promise

请参阅演示here

function get(url) {
        return $http.get(url)
          .then(function(d){ 
            return d.data
          },
          function(err){  //will work without handling error here, but I need to do some processing here
            //call gets here
            //do some processing
            return err
          })
      }

      get('http://ip.jsontest.co')
      .then(function(response){
        $scope.response = "SUCCESS --" + JSON.stringify(response);
      }, function(err){
        $scope.response = "ERROR -- " + err;
      })

我有一个库函数get,它返回一个promise。我在那里处理错误,并返回它(我评论//do some processing)。我期待在客户端,它调用错误/失败处理程序。而是打印"SUCCESS --" + error

我可以使用$qreject来完成这项工作,但有没有办法?

2 个答案:

答案 0 :(得分:0)

return err替换为$q.reject(err),当然需要注入$q

在promise链接中,如果要将错误传递下来,则需要从当前错误处理程序返回被拒绝的promise。否则,如果返回值是立即值或已解决的promise,则认为错误被处理,因此以后的错误处理程序将不会被调用。

答案 1 :(得分:0)

一般而言:

  • 每当您从承诺处理程序返回时,您解析表示正常的流程延续。
  • 每当您在承诺处理程序抛出时,您拒绝指示异常流程。

在同步方案中,您的代码是:

function get(url){
    try{
       return $http.get(url);
    } catch(err){
        //handle err
    }
}

如果你想进一步传递,你需要重新抛出:

function get(url){
    try{
       return $http.get(url);
    } catch(err){
        //handle err
        throw err;
    }
}

承诺就是这样:

function get(url){
    return $http.get(url)
      .then(function(d){ 
        return d.data
      },
      function(err){  //will work without handling error here
        //call gets here
        //do some processing
        throw err; // note the throw
      })
  };

或者甚至更复杂的语法:

function get(url){
     return $http.get(url).catch(function(err){
           // do some processing
           throw err;
     });
}