2015-11-05 76 views
1

我做定製$http服務,是這個樣子:AngularJS服務回報狀態

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

連接失敗時,如何使它在失敗部分返回?

回答

1

您正在使用then鏈接,其中說,除非第一個然後處理程序方法返回一個承諾對象第二個調用成功處理程序將被調用。

該方法返回一個新的承諾,其解決或者經由 的successCallback,errorCallback(的返回值被拒絕,除非該 值是一個承諾,在這種情況下,它與哪個 在解析值解析承諾使用承諾鏈)。它還通過notifyCallback方法的返回值通知 。該承諾不能通過notifyCallback方法解決或拒絕 。

由於你的情況,你是從第一個處理程序返回result對象,由then方法返回的承諾被認爲是解決,這樣第二then的成功處理程序被調用。

您可以使用如下的成功/錯誤處理程序來修復它

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

非常感謝您的回答。您的解決方案適用於返回錯誤。但是,如果我希望在輸出失敗前多次重試失敗連接,那麼如何完成?這似乎不適用於您的解決方案。 – user1995781

0

我已經寫了兩個辦法讓mehtod調用和處理錯誤

** 1。 $ HTTP函數已經返回無極對象本身

//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

+0

感謝您的回答。但是您的工廠方法不會捕獲失敗連接。這意味着我想要成功,並且在回傳給控制器之前無法通過工廠進行一些處理。 – user1995781

+0

使用The Verbose Way或將.error(函數(響應)方法應用到工廠 – Shohel

+0

試圖用你的詳細方式。它可以工作,但是成功或失敗,沒有數據傳遞。 – user1995781