从承诺外部访问数据

Accessing Data from outside a promise

本文关键字:数据 访问 外部 承诺      更新时间:2023-09-26

我正在使用角度和 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中添加东西通常不是最好的主意。