我正在构建我的第一个角度应用程序,我遇到了一个问题。我有一个AngularJS资源,它的.get调用成功和错误回调,如下所示:
var new_uptime = Uptime.get({}, function(){
console.log("new_uptime", new_uptime, "$scope.uptime", $scope.uptime);
console.log("new_uptime.uptime", new_uptime.uptime);
if ($scope.uptime && new_uptime.uptime < $scope.uptime.uptime) {
console.log("Reboot detected");
location.reload(true);
}
$scope.uptime = new_uptime;
$timeout(reload_uptime, 5000);
}, function(response){
console.log("Failed to read uptime", response);
console.log("Retrying in 10s");
$scope.uptime = "[unknown]";
$timeout(reload_uptime, 10000);
}); 我已经用服务器上的各种错误状态测试了它,它运行得很好。现在,我想在503上添加应用程序范围的重试。我为此添加了一个模块,如下所示:
retry_module = angular.module('service.retry', []);
retry_module.factory("retry", ["$q", "$injector", "$timeout", function($q, $injector, $timeout) {
return {
"responseError": function(rejection) {
console.log("Request failed", rejection);
if (rejection.status != 503) {
console.log("Unhandled status");
return $q.reject(rejection);
}
var delay = Math.floor(Math.random() * 1000);
console.log("Was 503, retrying in " + delay + "ms");
var deferred = $q.defer();
$timeout(function() {
var $http = $http || $injector.get("$http");
deferred.resolve($http(rejection.config));
}, delay);
return deferred;
}
};
}]);
retry_module.config(["$httpProvider", function ($httpProvider) {
$httpProvider.interceptors.push("retry");
}]);这可以很好地重新尝试503,并且成功的尝试是由Uptime.get调用方中的成功回调处理的,就像预期的那样。但是,如果服务器返回其他错误,则会得到“未处理状态”打印输出,但"new_uptime“或”读取正常运行时间失败“。我的拒绝到哪里去了,我该如何解决这样的问题呢?
发布于 2013-10-29 08:42:00
你需要回报承诺,而不是延迟的承诺。因此,您的responseError处理程序的结束应该是:
var deferred = $q.defer();
$timeout(function() {
var $http = $http || $injector.get("$http");
deferred.resolve($http(rejection.config));
}, delay);
return deferred.promise;https://stackoverflow.com/questions/19653256
复制相似问题