我正在使用angular和restangular,尝试定义我从API中获取的默认标头。
永远不会使用最终令牌定义令牌变量。我理解为什么,或多或少。但我还没有想出办法让这个价值超出承诺。我已经尝试了范围,什么不是。我试过调用promise中的默认头文件。下面的代码片段显示了一些随机尝试。
angular
.module('app')
.run(function (Restangular, TokenService) {
var Token;
TokenService.get().then( function(data) {
console.log(data.data); //The Correct Token from API
Token = data.data;
return data.data;
}
);
Restangular.setDefaultHeaders({
'X-XSRF-TOKEN': Token //Token is undefined
});
});
如何正确完成?
答案 0 :(得分:2)
在Promise中移动Token的访问权限。承诺的.then在.run完成之后的某个时间运行,这就是为什么Token未定义的原因。没有办法改变这种行为。
angular
.module('app')
.run(function (Restangular, TokenService) {
TokenService.get().then( function(data) {
console.log(data.data); //The Correct Token from API
var token = data.data;
Restangular.setDefaultHeaders({
'X-XSRF-TOKEN': token
});
return data.data;
}
);
});
答案 1 :(得分:1)
是的,以下代码将解决使用闭包变量的JavaScript问题。它会调用Restangular
来设置标题值。
angular
.module('app')
.run(function (Restangular, TokenService) {
TokenService.get().then( function(data) {
Restangular.setDefaultHeaders({
'X-XSRF-TOKEN': data.data
});
}
);
});
但是,这种方法有什么问题?
TokenService是一个异步服务,Angular将开始获取令牌并继续初始化应用程序。使用Restangular
的指令或服务可能会尝试在TokenService.get(...)
完成之前执行需要标头令牌的操作!
有三种可能的解决方案。
首先获取令牌。在角度开始之前,您必须使用TokenService(我不知道它是什么)。
angular.element(document).ready(function(){
// first get token
TokenService.get().then(function(data){
// put the token somewhere
window.token = data.data;
// then start angular
angular.bootstrap(document,['myApp']);
});
});
现在你可以在角度开始时使用令牌。
angular
.module('app')
.run(function (Restangular) {
Restangular.setDefaultHeaders({
'X-XSRF-TOKEN': window.token
});
);
});
TokenService
是什么,如何在角度开始之前得到它以及你应该把事情放到window
中并不是答案的重点。我只是想确保您了解应用启动时和设置令牌之间存在延迟。所以最好先这样做。
答案 2 :(得分:0)
如果您需要令牌的唯一内容是调用setDefaultHeaders,您应该可以直接在当时的调用中执行此操作,如:
TokenService.get().then( function(data) {
Restangular.setDefaultHeaders({
'X-XSRF-TOKEN': data.data
});
});
如果你需要在整个应用程序中提供令牌,我猜你可以在'run'调用中注入'$ rootScope'然后在'then'里面你可以分配它:
$rootScope.Token = data.data;
这会使Token在注入$ rootScope的任何地方都可用;请记住,向$ rootScope添加内容通常不是最好的主意。