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

Angularjs 如何使控制器等待app.run完成,angularjs,angular-http,Angularjs,Angular Http,在我的应用程序中,我使用$http.get()在app.run中获取一些数据 此操作的结果需要转到控制器。 当前,我的控制器在完成此$http.get之前正在执行 在执行$http.get()之后,如何使控制器执行 run目前无法处理异步工作。见本期: 你有多种解决方案。您可以在不使用Angular的情况下获取数据并手动启动Angular() 或者,您可以使用路由解析来执行此操作:您可以使用角度范围事件。获取数据时,您可以从$rootScope向所有控制器广播事件,并在目标控制器中接收此事件。您

在我的应用程序中,我使用$http.get()在app.run中获取一些数据 此操作的结果需要转到控制器。 当前,我的控制器在完成此$http.get之前正在执行 在执行$http.get()之后,如何使控制器执行


run
目前无法处理异步工作。见本期:

你有多种解决方案。您可以在不使用Angular的情况下获取数据并手动启动Angular()


或者,您可以使用路由解析来执行此操作:

您可以使用
角度范围事件。获取数据时,您可以从
$rootScope
向所有控制器广播事件,并在目标控制器中接收此事件。

您可以使用
$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)
    });
})

希望这对您有所帮助。

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

function waitForRun() {
  if($rootScope.runFinalized){
    // do something
  } else {
    $timeout(waitForRun, 500)
  }
}
waitForRun();
在最后一个.run块之后:

.run(function($rootScope) { $rootScope.runFinalized = true; })
很难看,但很管用

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