Javascript 在继续之前,等待AngularJS中的承诺解决

Javascript 在继续之前,等待AngularJS中的承诺解决,javascript,angularjs,Javascript,Angularjs,在我的angularapp.run()方法中,我调用了一个API来获取一些数据,然后将这些数据附加到$rootScope-应用程序在不同的地方需要这些数据,因此这对我来说似乎是获取数据的地方 代码是: var app = angular.module('app', ['ngAnimate', 'infinite-scroll', 'ui.router', 'ui.bootstrap', 'app.filters', 'app.services', 'app.directives', 'app.c

在我的angular
app.run()
方法中,我调用了一个API来获取一些数据,然后将这些数据附加到
$rootScope
-应用程序在不同的地方需要这些数据,因此这对我来说似乎是获取数据的地方

代码是:

var app = angular.module('app', ['ngAnimate', 'infinite-scroll', 'ui.router', 'ui.bootstrap', 'app.filters', 'app.services', 'app.directives', 'app.controllers'])

.run(['$templateCache', '$rootScope', '$state', '$stateParams', '$modalStack', 'appInit', function ($templateCache, $rootScope, $state, $stateParams,$modalStack, appInit) {

        // set loading to 0 for loading mask
        $rootScope.loading = 0;

        var globalPromise = appInit.getGlobal();//

        //var globalPromise = appInit.getGlobal();
        globalPromise.then(function (data) {                          

            // attach globalJSON to rootScope
            $rootScope.globalJSON = data;

        });

    }]);
因此,我需要在应用程序的其余部分运行之前完成
globalPromise.then()

我遇到的问题是,有时
globalPromise
返回所需的时间比某些控制器执行和构建模板所需的时间稍长,在这些情况下,模板中的某些指令需要
$rootScope.globalJSON
可用。如果不是,那么这些指令和其他任何需要它的指令都会出错


有没有办法暂停应用程序,直到承诺兑现?或者我应该将其从angular和bootstrap angular中分离出来吗?

这可能不是最优雅的,但我在应用程序中提出了一个类似问题的解决方案,我想在应用程序加载时从服务器检索i18n资源包

其基本思想是,虽然请求是异步的,但获得承诺是同步的。如果在该对象上设置占位符值,至少可以伪造所需的引用,直到它们最终到达。在此基础上,利用AngularJS的数据绑定将绑定更新为promise的实际结果

var globalPromise = appInit.getGlobal();//

globalPromise.then(function (data) {                          

  // attach globalJSON to rootScope
  $rootScope.globalJSON = data;

});

angular.extend(globalPromise, { /* insert your placeholder object data here */ });

$rootScope.globalJSON = globalPromise;

我假设您正在获取的数据是将由Angular的绑定机制处理的数据(因此,当您获得正确的globalJSON时,能够更新绑定)。

不管您已经解决了一个问题,我想分享一个我发现几乎完全相同的问题的解决方案

在应用程序的sturtup上,我必须使用
$http
服务来获取一些数据,在成功回调时,将这些数据保存到服务中,这些数据已经被几个控制器使用过。然而,有时这个异步调用的速度不够快,无法在使用其数据之前完成。为了解决这个问题,我不得不使用
$broadcast
服务

这就是我的服务(在咖啡脚本中):

我在控制器中要做的就是等待
'myData:updated'
事件:

app.controller 'MyCtrl', ($scope, Task) ->
  $scope.$on 'myData:updated', (event, data) ->
    $scope.myData = data
    # do whatever you like with that data

希望它能帮助别人

$rootScope.$state=$state$rootScope.$stateParams=$stateParams你为什么要这样做?这是其他领域所需要的-没有发布每一行代码,尽管这部分与我的问题无关。谢谢Rich,这会很好:)
app.controller 'MyCtrl', ($scope, Task) ->
  $scope.$on 'myData:updated', (event, data) ->
    $scope.myData = data
    # do whatever you like with that data