Angular Catch 方法不适用于 $http get 请求

Angular Catch method not working with $http get request

我正在尝试在处理来自 API 的错误时巧妙地管理来自控制器的服务函数调用。

但是,当我执行以下操作时,即使 API 返回 403 或 404,我的控制台中仍然会显示 this is showing even with 403 and 404 errors

我假设如果我在我的服务文件中添加 catch 这可能会起作用,但我更愿意将其从控制器管理。这可能吗?

控制器:

angular.module('EnterDataCtrl', []).controller('EnterDataController', ['$scope', 'Data', '$state', function ($scope, Data, $state) {
    vm = this;
    vm.getRules = function (e, rule_query, data) {
        if (e.keyCode == 13) {

            Data.getRules(rule_query,data).then(function (data) {
                console.log('this is showing even with 403 and 404 errors');
            }).catch(function(res) {
                console.log(res);
            });
        }
    }
}]);

服务:

angular.module('EnterDataService', []).factory('Data', ['$http', function ($http) {

    return {

        getRules: function getRules(rule_query,data) {
            var apiBase = apiUrl + 'get-rules';
            var config = {
                handleError:true,
                params: {
                    rule_query: rule_query,
                    data : data
                }
            };
            return $http.get(apiBase, config).catch(function () {});
        }

    }
}]);

在您的服务中,您是在设置捕获器而不做任何事情。这通常是不好的做法,如果您要使用 catch 块,则在那里处理错误。如果不是,则根本不要声明捕获。

您可以从服务方法中完全删除 catch,这应该会导致控制器的 catch 处理它。

或者,您可以将 catch 留在服务调用中,并确保抛出错误以正确冒出错误。

当拒绝处理程序省略 throw 语句时,它 returns undefined。这 将被拒绝的 promise 转换为 undefined

已实现的 promise

为避免意外转换,在拒绝处理程序中包含 throw 语句很重要。

app.service('Data', ['$http', function ($http) {

    this.getRules = function getRules(rule_query,data) {
        var apiBase = apiUrl + 'get-rules';
        var config = {
            handleError:true,
            params: {
                rule_query: rule_query,
                data : data
            }
        };
        //return $http.get(apiBase, config).catch(function () {});
        return $http.get(apiBase, config)
          .catch(function (errorResponse) {
             console.error("Data service error");
             //IMPORTANT
             throw errorResponse;
        });
    }
}]);