【问题标题】:Why isn't my $resource error handler called when I have a responseError interceptor?为什么当我有 responseError 拦截器时没有调用我的 $resource 错误处理程序?
【发布时间】:2013-10-29 16:42:00
【问题描述】:

我正在构建我的第一个 Angular 应用程序,但遇到了问题。我有一个 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);
}); 

我已经用来自服务器的各种错误状态对此进行了测试,它工作正常。现在我想在 503s 上添加应用程序范围的重试。我为此添加了一个模块,如下所示:

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”也不是“读取正常运行时间失败”。我的拒绝去哪儿了,我该如何解决此类问题?

【问题讨论】:

    标签: angularjs angularjs-resource


    【解决方案1】:

    您需要返回承诺,而不是延迟。所以你的 responseError 处理程序的结尾应该是:

            var deferred = $q.defer();
            $timeout(function() {
                var $http = $http || $injector.get("$http");
                deferred.resolve($http(rejection.config));
            }, delay);
            return deferred.promise;
    

    【讨论】:

    • 对。似乎这个问题导致我的打印输出与我的预期不符。重新拒绝非 503 响应(这是我担心的)实际上是有效的,但由于您指出的问题,我没有看到它。谢谢!
    • 在我的情况下,我只是返回响应而不是重新拒绝它,这产生了同样的问题。
    猜你喜欢
    • 2019-04-06
    • 2015-06-03
    • 2019-09-26
    • 1970-01-01
    • 2020-01-31
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    相关资源
    最近更新 更多