Javascript AngularJS:如何留在';运行';方法,直到它完成
我有一个简单的场景——我希望使用拦截器初始化我的http调用,拦截器将在头中添加一个值(某种令牌) 问题是令牌也是通过http接收的(它应该是第一个调用),但我不知道如何在发出自己的调用之前进行所有其他调用以等待它完成Javascript AngularJS:如何留在';运行';方法,直到它完成,javascript,angularjs,angular-http-interceptors,Javascript,Angularjs,Angular Http Interceptors,我有一个简单的场景——我希望使用拦截器初始化我的http调用,拦截器将在头中添加一个值(某种令牌) 问题是令牌也是通过http接收的(它应该是第一个调用),但我不知道如何在发出自己的调用之前进行所有其他调用以等待它完成 工厂('sessionData',函数(){ var currentToken='[uninitialized token]'; 返回{ getToken:函数(){ 返回当前令牌; }, setAuthData:函数(令牌){ currentToken=token; } } }
工厂('sessionData',函数(){
var currentToken='[uninitialized token]';
返回{
getToken:函数(){
返回当前令牌;
},
setAuthData:函数(令牌){
currentToken=token;
}
}
})
.factory('sessionInjector',['sessionData',函数(sessionData){
变量sessionInjector={
请求:函数(配置){
log(“使用令牌发送:+sessionData.getToken());
config.headers['x-header-sessionID']=sessionData.getToken();
}
};
返回会话导入器;
}])
.config(['$httpProvider',函数($httpProvider){
$httpProvider.interceptors.push('sessionInjector');
}])
.run(['$http',configs',sessionData',function($http,configs,sessionData){
$http.get(configs.authApiUrl+'login')。然后(函数(ret){
sessionData.setAuthData(ret);
log(“使用令牌成功验证”+sessionData.getToken());
});
}])
.controller('TestCtrl',函数($http){
$scope.p1=‘未初始化’;
$http.get('http://localhost/api/getData)。然后(函数(ret){
$scope.p1=ret;
});
});
问题在于TestCtrl
在run
方法完成获取令牌之前发出http调用(导致头值的值中包含[uninitialized token])
如何使控制器等待“运行”异步方法完成?$http拦截器可用于在其回调中返回承诺。您可以使用它拦截每个呼叫并延迟它,直到承诺得到解决 你应该明白承诺是如何实现的 例如:
myModule.factory('tokenPromise', function($http) {
return $http.get({url: 'myurl/token', bypassToken: true}).then(function(data) {
// This is when your token webservice return, deal with the response here
return data.token;
});
});
myModule.factory('myHttpInterceptor', function($q, tokenPromise) {
return {
'request': function(config) {
if (config.bypassToken) return config;
// This ensures the token promise is resolved before proceeding with the request.
return tokenPromise.then(function(token) {
config.headers['x-header-sessionID'] = token;
return config;
});
},
};
});
myModule.config(function($httpProvider) {
//wire the interceptor here
$httpProvider.interceptors.push('myHttpInterceptor');
})
参考资料:例如,您可以将所有http请求移动到sessionData,并提供一些接口来使用ITI如果您使用的是ui路由器,最好是解决主父状态是的,我已经走了这条路,但angular抱怨循环引用(http哦,我不介意这种情况。你是否尝试在配置中添加一个标志以强制不延迟这一特定呼叫?我将更新我的答案。我已将此标记为答案,因为它确实解决了我遇到的特定问题,即使它没有解决问题的方式发布…这是一个很好的答案…thx