AngularJS服务返回状态

时间:2015-11-05 03:42:41

标签: javascript angularjs

我正在做自定义$http服务,看起来像这样:

angular.factory('myHttp', function($http){
  var obj = {};

  obj.get = function(path) {
     return $http.get(path).then(function(result){
        return result;
     },function(result){
       console.log("result error:"+path);
       return result;
   });
 }

然后,可以像这样使用服务:

    myHttp.get($scope.url).
      then(function(response) {
        console.log("It's success");
        $scope.status = response.status;
        $scope.data = response.data;
      }, function(response) {
        console.log("It's fail");
        $scope.data = response.data || "Request failed";
        $scope.status = response.status;
    });

它确实返回成功和失败的结果。但是,即使它失败了,它仍然会在成功部分返回。这意味着,如果连接失败,我仍然会在控制台中获得It's success

当连接失败时如何让它在失败部分返回?

2 个答案:

答案 0 :(得分:1)

您正在使用then链接,除非第一个处理程序方法返回一个promise对象,否则将调用第二个调用成功处理程序。

  

此方法返回通过解析或拒绝的新承诺   successCallback的返回值,errorCallback(除非那个   value是一个promise,在这种情况下,它用值来解析   使用promise chaining解决了这个承诺。它也通知   通过notifyCallback方法的返回值。承诺不能   从notifyCallback方法中解析或拒绝。

因为在您的情况下,您从第一个处理程序返回result对象,then方法返回的保证被视为已解决,因此第二个then的成功处理程序是调用

您可以使用如下的成功/错误处理程序来修复它

obj.get = function (path) {
    return $http.get(path).error(function (result) {
        console.log("result error:" + path);
    });
}

答案 1 :(得分:0)

我写了两种方法来调用mehtod并处理错误

** 1。 $ http函数已经自己返回一个Promise对象

//factory method
obj.get = function (path) {
    return $http.get(path).then(function (results) {
        return results.data;
    });
};

//call from controller
myHttp.get($scope.url).then(function (response) {
    console.log("It's success");
    $scope.status = response.status;
    $scope.data = response.data;
}).error(function (response) {
    console.log("It's fail");
    $scope.data = response.data || "Request failed";
    $scope.status = response.status;
});


2. The Verbose Way
obj.get = function (path) {
    var def = $q.defer();
    $http.get(path).success(function (data) {
        def.resolve(data);
    }).error(function () {
        def.reject("Failed to get");
    });
    return def.promise;
};

//call from controller
myHttp.get($scope.url).then(function (response) {
    console.log("It's success");
    $scope.status = response.status;
    $scope.data = response.data;
},
function (response) {
    console.log("It's fail");
    $scope.data = response.data || "Request failed";
    $scope.status = response.status;
});

以下是清晰了解$http

的链接