【发布时间】: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