如何在执行anjularjs中的控制器之前使用$ http同步调用在.run()中获取数据

时间:2015-04-21 19:56:48

标签: javascript angularjs http synchronous

.run()我正在尝试从URL获取数据,以便稍后用作每个请求的标头的一部分。

所以在.run()函数中,我使用$http.get来获取该数据(生成令牌)并分配给全局值。

$http.get即使在控制器初始化之后也会返回数据的问题,以及如何从URL(同步)获取此数据(令牌)然后执行控制器的初始化。 这是我的代码:

var appc=angular.module('app', []);
appc.value('mytoken', '');
appc.value('RESTUrl', 'http://localhost/token');
appc.run(function ($http, RESTUrl, $q, mytoken) {



$http.get(RESTUrl +'?user=currss').then (function (response)
{
    mytoken = response.data;
}, function (response) { console.log('error:' + response.data);}
);

- 控制器:

appc.module('ctrl',[])
.controller('ctrl', function ($scope, $http,mytoken,MyService) {
console.log("controller inistializing !");

MyService.getinfo(mytoken)
    .then(function (response) {
       $scope.DataList = respone.data;

    }, function (response) {
        console.log(response.status);
        console.log(response.data)
    }
    )

.catch(function (response) {
    $window.alert('error');
});

}) 

2 个答案:

答案 0 :(得分:0)

不可能。同样强制Angular,一般来说,JavaScript是同步的是错误的模式。

正确的做法是将令牌放在服务中并从那里访问它。服务返回的值实际上是一个承诺。

module.service('Authentication', function ($http, RESTUrl, $q, mytoken) {
    var tokenDeferred = $q.deferred();
    $http.get(RESTUrl +'?user=currss').then (function (response){
        tokenDeferred.resolve(response.data);
    }, function (response) {
        tokenDeferred.reject(response);
    });

    this.getToken = function() {
        return tokenDeferred.promise;
    };
});

然后像这样使用它:

Authentication.getToken().then(
    function(data) {
        // success function
    },function(errMsg) {
        // error function
    }
)

答案 1 :(得分:0)

我会建议您在成功登录时从后端获取令牌,并将此令牌存储到任何服务变量或cookies.so,然后再移动到仪表板,通过登录响应,您将令牌存储在app变量中。