我正在做自定义$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
。
当连接失败时如何让它在失败部分返回?
答案 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
的链接