【问题标题】:Restangular interceptor to handle $q.all request用于处理 $q.all 请求的 Restangular 拦截器
【发布时间】:2018-05-17 11:34:40
【问题描述】:

我需要 Restangular 拦截器的帮助。我可以重试请求所有失败的 API 调用,但数据没有返回到调用函数的成功方法。

当不使用$q.all 时,拦截器工作正常。我需要帮助如何返回数据。

下面是我的拦截器代码:

authrestangular.factory("AuthRestangular", function (Restangular, $q, $injector, $location, localStorageService, $filter, $timeout, cfpLoadingBar, $cookies) {
    return Restangular.withConfig(function(RestangularConfigurer) {
        RestangularConfigurer.addFullRequestInterceptor(function (element, operation, route, url, headers) {
            cfpLoadingBar.start();
            var token = $cookies.get('token');
            if (token) {
                headers.Authorization = "Bearer " + token;
            }
        });

        RestangularConfigurer.setErrorInterceptor(function (response, deferred, responseHandler) {
            if (response.status === 401) {
                var prevConfig = response.config;
                _responseError($q, $injector, $location, response, prevConfig).then(function (res) {
                    console.log(res);
                    if (pendingRequests.length > 0) {
                        angular.forEach(pendingRequests, function (req) {
                            req.headers.Authorization = 'Bearer ' + res.access_token;
                            _retryHttpRequest(res, req, deferred);
                        });
                        pendingRequests = [];
                    } else {
                        _retryHttpRequest(res, response.config, deferred)
                    }
                    var authService = $injector.get("authService");
                    authService.authentication.isRefreshing = false;
                }, function (err) {
                    console.log("Error", err);
                });
                return false;
            }

            if (response.status === 500) {
                $location.path("error");
            }

            return true;
        });

        RestangularConfigurer.addResponseInterceptor(function (data, operation, what, url, response, deferred) {
            var extractedData;

            if (operation === "getList") {
                extractedData = response.data.Rows;
                extractedData.pagination = response.data.Pagination;
            } else {
                extractedData = response.data;
            }

            return extractedData;
        });

    });
});

var _responseError = function ($q, $injector, $location, response, prevConfig) {
    var deferred = $q.defer();
    var authService = $injector.get("authService");
    if (authService.authentication.isRefreshing) {
        pendingRequests.push(prevConfig);
    } else {
        authService.refreshToken().then(function (response) {
            if (pendingRequests.length > 0) {
                angular.forEach(pendingRequests, function (req) {
                    req.headers.Authorization = 'Bearer ' + response.access_token;
                    _retryHttpRequest($injector, req, deferred)
                });
            } else {
                prevConfig.headers.Authorization = 'Bearer ' + response.access_token;
                _retryHttpRequest($injector, prevConfig, deferred);
            }
            deferred.resolve(response);
        }, function () {
            authService.logOut();
            $location.path("/portal");
            deferred.reject(response);
        });
    }
    authService.authentication.isRefreshing = true;
    return deferred.promise;
}

var _retryHttpRequest = function ($injector, config, deferred) {
    $http = $http || $injector.get("$http");
    $http(config).then(function (response) {
        var extractedData;

        if (response.data.Rows && response.data.Pagination) {
            extractedData = response.data.Rows;
            extractedData.pagination = response.data.Pagination;
        }
        else {
            extractedData = response.data;
        }

        deferred.resolve(extractedData);
    }, function (response) {
        deferred.reject(response);
    });
}

上面包含的是我的拦截器的所有代码,refreshToken() 只是刷新我的令牌。我在这里所做的是,如果 refreshToken() 函数被调用一次,那么我设置了一个标志,表明我的令牌仍在刷新。这将解决令牌刷新时的问题,并且其他 API 调用仍在使用旧的访问令牌。

下面是调用api的函数

var initializeDDLs = function () {
    var ddlAPIcalls = [
        authRestangular.one("PositionAPI/getddl").get(),
        authRestangular.one("Employee201API/getddl").get(),
        authRestangular.one("StatusAPI/getddl").get({ moduleId: Common.constants.civilStatus }),
        authRestangular.one("TypeAPI/getddl").get({ moduleId: Common.constants.bloodType }),
        authRestangular.one("PositionAPI/getPositionCodeddl").get(),
        authRestangular.one("TypeAPI/getddl").get({ moduleId: Common.constants.educationalLevel }),
        authRestangular.one("EmployerAPI/getddl").get(),
        authRestangular.one("BusinessUnitAPI/getddl").get(),
        authRestangular.one("TypeAPI/getddl").get({ moduleId: Common.constants.locationType }),
        authRestangular.one("StatusAPI/getddl").get({ moduleId: Common.constants.employmentStatus }),
        authRestangular.one("StatusAPI/getddl").get({ moduleId: Common.constants.employmentStatusBefore }),
        authRestangular.one("TypeAPI/getddl").get({ moduleId: Common.constants.salaryType }),
        authRestangular.one("TypeAPI/getddl").get({ moduleId: Common.constants.basicRateType }),
        authRestangular.one("TypeAPI/getddl").get({ moduleId: Common.constants.documentType }),
        authRestangular.one("Employee201API/getsystemroleddl").get(),
        authRestangular.one("ShiftAPI/getddl").get(),
        authRestangular.one("KeyQuestionAPI/getddl").get()
    ];

    $q.all(ddlAPIcalls)
        .then(function (response) {
            console.log(response);
        }, function (err) {
            console.log(response);
        });

};

代码不会触发.then 响应,这是假设的成功响应将返回我要显示的数据。

请帮忙。不知道该怎么办了。

【问题讨论】:

    标签: angularjs interceptor restangular angular-http-interceptors


    【解决方案1】:

    您应该在将 API 推送到列表之前检查条件。 示例:

    var apiList = [];
    
    if (!$rootScope.apiOneData) {
      apiList.push(ApiOne.then(
        function (data) {
          // Success this API
          $rootScope.apiOneData = data;
        },
        function (error) {
          // Handle error in this API
        }
      ));
    }
    
    if (!$rootScope.apiTwoData) {
      apiList.push(ApiTwo.then(function (data) {
        // Success this API
        $rootScope.apiOneData = data;
      }));
    }
    
    if (!apiList.length) {
      return;
    }
    
    $rootScope.isLoading = true;
    
    return $q.all(apiList)
      .then(function (data) {
    
        // Success all
        // Do something
      }, function (error) {
        // Error
        // Do something
      });
    

    【讨论】:

    • 检查条件是什么意思?对不起。我不熟悉 rootScope
    猜你喜欢
    • 2014-05-29
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2015-05-16
    • 2023-01-13
    • 1970-01-01
    • 2016-01-13
    • 2015-11-13
    相关资源
    最近更新 更多