从承诺外部访问数据

时间:2014-12-03 22:51:38

标签: javascript angularjs promise restangular

我正在使用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

        });
    });

如何正确完成?

3 个答案:

答案 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添加内容通常不是最好的主意。