【发布时间】:2018-03-14 12:58:00
【问题描述】:
您好,我目前正在尝试通过我的服务获取访问令牌,但是,问题是当我没有访问令牌时,我尝试使用将创建令牌的特殊 url 刷新页面,不幸的是函数仍然运行而无需等待此 url 加载新令牌。有没有办法添加承诺或者你有不同的方法?如果您有任何想法,请告诉我。谢谢!!
代码:
app.factory('HttpInterceptor', function ($q, $window, CustomService) {
return {
request: function (config) {
if(CustomService.getAccessToken() == undefined) {
$window.location.href = CustomService.getURL();
}
config.headers.Authorization = 'Bearer ' + CustomService.getAccessToken(); // this is still undefined since window.location.href is still loading
return $q.when(config);
},
responseError: function(response) {
if(response.status == 401){
$window.location.href = CustomService.getURL();
}
return $q.reject(response)
}
};
});
app.service('CustomService', function($location) {
this.getAccessToken = function() {
if(getParam('token')){
this.token = getParam('token');
}
return this.token;
}
this.getURL = function(){
var redirectUrl = //adds url
return redirectUrl;
}
function getParam(name) {
var token = null;
token = //adds token info
return token;
}
});
【问题讨论】:
-
如果
CustomService返回一个promise,可以用来延迟。我们需要查看CustomService的代码以了解如何修改它以使用拦截器。因为调用 Promise 的.then方法会返回一个新的派生 Promise,所以很容易创建一个 Promise 链。有关详细信息,请参阅AngularJS $q Service API Reference - Chaining Promises。 -
@georgeawg 感谢您的帮助!我添加了我的 CustomService 代码,我删除了一些信息,但是,我可以转换为使用承诺延迟的 getURL 这是您的建议吗?
标签: angularjs oauth-2.0 angular-http-interceptors