如何使控制器等待直到app.run完成

时间:2015-10-26 15:34:12

标签: angularjs angular-http

在我的应用程序中,我使用$ http.get()在app.run中获取一些数据 由此产生的结果需要进入控制器。 目前我的控制器在$ http.get完成之前执行 如何在执行$ http.get()

后使控制器执行
app.run(function ($rootScope, $http, $cookies) {
var currentLanguageId = angular.fromJson($cookies.get('mykey')).UserInfo.Country;

    $http.get('myurl').then(function (serviceInfo) {


        $rootScope.serviceURL = serviceInfo.data.serviceURL;

    }, function (error) {
        alert('error service info');
    });

4 个答案:

答案 0 :(得分:1)

{{1}}目前无法处理异步工作。请参阅此问题:https://github.com/angular/angular.js/issues/4003

您有多种解决方案。您可以在没有Angular的情况下获取数据并手动启动Angular(How to wait for a promise in a Run block in Angular?

或者您可以使用路线的决心执行此操作:AngularJS : Initialize service with asynchronous data

答案 1 :(得分:0)

您可以使用angular scope event。获取数据时,您可以将事件从$rootScope广播到所有控制器,并在目标控制器中接收此事件。

答案 2 :(得分:0)

您可以在app.run中使用$rootScope.$broadcast();,然后在控制器中使用$rootScope.$on()

app.run(function ($rootScope, $http, $cookies) {
    var currentLanguageId = angular.fromJson($cookies.get('mykey')).UserInfo.Country;
    $http.get('myurl').then(function (serviceInfo) {
        $rootScope.serviceURL = serviceInfo.data.serviceURL;
        $rootScope.$broadcast('serviceInfoReceived')
    }, function (error) {
        alert('error service info');
    });
});

在您的控制器

app.controller ('myCtrl' , function($rootScope) {
    $rootScope.$on("serviceInfoReceived", function(){
         console.log($rootScope.serviceURL)
    });
})

希望这可以帮助你。

答案 3 :(得分:0)

这是一个古老的问题,但是$ rootScope。$ on解决方案并不总是有效。这将取决于控制器注册侦听器的时间。我发现有效的方法是设置一个$ rootScope属性,然后配置一个递归超时以等待它被设置。

function waitForRun() {
  if($rootScope.runFinalized){
    // do something
  } else {
    $timeout(waitForRun, 500)
  }
}
waitForRun();

以及最后一个.run块之后:

.run(function($rootScope) { $rootScope.runFinalized = true; })

丑陋,但是可行。