首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我有一个$resource拦截器时,为什么不调用我的responseError错误处理程序?

当我有一个$resource拦截器时,为什么不调用我的responseError错误处理程序?
EN

Stack Overflow用户
提问于 2013-10-29 08:35:20
回答 1查看 1K关注 0票数 1

我正在构建我的第一个角度应用程序,我遇到了一个问题。我有一个AngularJS资源,它的.get调用成功和错误回调,如下所示:

代码语言:javascript
运行
复制
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上添加应用程序范围的重试。我为此添加了一个模块,如下所示:

代码语言:javascript
运行
复制
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“或”读取正常运行时间失败“。我的拒绝到哪里去了,我该如何解决这样的问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-29 08:42:00

你需要回报承诺,而不是延迟的承诺。因此,您的responseError处理程序的结束应该是:

代码语言:javascript
运行
复制
        var deferred = $q.defer();
        $timeout(function() {
            var $http = $http || $injector.get("$http");
            deferred.resolve($http(rejection.config));
        }, delay);
        return deferred.promise;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19653256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档