【发布时间】:2015-08-06 23:19:59
【问题描述】:
我有一个简单的场景 - 我希望使用拦截器初始化我的 http 调用,该拦截器将在标头中添加一个值(某种标记)。
问题是令牌也是通过 http 接收的(它应该是第一次调用),但我不知道如何让所有其他调用等待它完成,然后再发出自己的调用...
.factory('sessionData', function () {
var currentToken = '[uninitialized-token]';
return {
getToken: function () {
return currentToken;
},
setAuthData: function (token) {
currentToken = token;
}
}
})
.factory('sessionInjector', ['sessionData', function (sessionData) {
var sessionInjector = {
request: function (config) {
console.log("sending with token: " + sessionData.getToken());
config.headers['x-header-sessionID'] = sessionData.getToken();
}
};
return sessionInjector;
}])
.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push('sessionInjector');
}])
.run(['$http', 'configs', 'sessionData', function ($http, configs, sessionData) {
$http.get(configs.authApiUrl + 'login').then(function (ret) {
sessionData.setAuthData(ret);
console.log("successfully authenticated with token " + sessionData.getToken());
});
}])
.controller('TestCtrl', function($http){
$scope.p1 = 'Uninitialized';
$http.get('http://localhost/api/getData').then(function(ret){
$scope.p1 = ret;
});
});
问题在于TestCtrl 在run 方法完成获取令牌之前发出http 调用(导致标头值包含[uninitialized-token])。
如何让控制器等待“运行”异步方法完成?
【问题讨论】:
-
比如你可以把所有的http请求移到sessionData中,并提供一些接口来使用它
-
如果您使用的是 ui-router,最好在解析主父状态时完成
标签: javascript angularjs angular-http-interceptors