从承诺外部访问数据
Accessing Data from outside a promise
我正在使用角度和 restangular,试图定义我从我的 API 获得的默认标头。
令牌变量永远不会使用最终令牌定义。我明白为什么,或多或少。但我还没有找到一种方法来从承诺中获得这种价值。我已经尝试过范围,什么都没有。我尝试在承诺中调用默认标头。下面的这个片段显示了一些随机尝试的组合。
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
});
});
如何正确完成此操作?
在 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;
}
);
});
是的,以下代码将解决使用闭包变量的 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(...)
完成之前需要该标头令牌的操作!
有三种可能的解决方案。
- 忽略问题。
- 使用状态变量指示令牌是否已设置,并等待其设置
- 在启动 Angular 之前获取令牌。
首先获取令牌。在 angular 开始之前,您必须使用 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
并不是答案的重点。我只是想确保您了解应用程序启动时间和设置令牌之间存在滞后。所以最好先这样做。
如果您唯一需要令牌的是调用 setDefaultHeaders,您应该能够直接在 then 调用中执行此操作,如下所示:
TokenService.get().then( function(data) {
Restangular.setDefaultHeaders({
'X-XSRF-TOKEN': data.data
});
});
如果您需要在整个应用程序中提供令牌,我想您可以在"运行"调用中注入"$rootScope",然后在"然后"中可以像这样分配它:
$rootScope.Token = data.data;
这应该使令牌在你注入$rootScope任何地方可用;请记住,向$rootScope中添加东西通常不是最好的主意。
- AngularJS-需要在index.html页面中访问来自服务的数据
- 如何使用Wordpress'RESTApi访问本地主机上的数据
- 访问令牌和响应数据
- 如何访问高图表工具提示中的任何特定数据
- 将JSON传递给Jade,并使用相同的数据进行API访问
- 访问Protractor/E2E测试中的$http数据(AngularJS)
- 使用Angular.js访问php数组数据
- 访问Twilio短信元数据
- 访问通过XHR.onreadystatechange回调中的XHR.send(data)发送的数据
- Codeigniter Jquery Ajax,Can't将控制器中的数据访问回html表单
- JavaScript IE 从 json 文件中读取数据 访问被拒绝
- 将twitter api1.0迁移到1.1 json数据访问问题
- 管理数据访问/用户权限
- Javascript json数据访问行和字段
- Javascript是否实现了类似SQL的数据访问
- 在猫鼬之上创建一个额外的数据访问层
- 角度.js数据访问器
- JavaScript数据访问设计
- 在bogart中使用承诺数据访问
- 在初始.ajax调用之外使用JSON数据-访问剩余的JSON数据