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

时间:2014-02-21 21:17:28

标签: javascript angularjs

我已经在我的角度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需要一些控制器来执行和构建模板需要更长的时间 - 在这些情况下,模板中的某些指令需要{{1}可用。当它不是,那些指令&其他需要它的东西,错误输出。

有没有办法暂停应用程序,直到该承诺得到满足?或者我应该在角度和自举角之后将其分开吗?

2 个答案:

答案 0 :(得分:1)

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

基本思想是,虽然您的请求是异步的,但获取承诺是同步的。如果在该对象上设置占位符值,则至少可以伪造所需的引用,直到它们最终到达。从那里开始使用AngularJS的数据绑定来更新绑定到实际的承诺结果。

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时能够更新绑定)。

答案 1 :(得分:0)

无论您解决了什么问题,我都想分享解决方案,我发现几乎完全相同的问题。

在应用程序的sturtup上,我必须使用$http服务来获取一些数据,并且在成功回调时将这些数据保存到服务中,这些数据已被多个控制器使用。但是,有时这种异步调用在使用其数据之前还不够快。要解决这个问题,我必须使用$broadcast服务。

这就是我的服务(在CoffeeScript中):

app.factory 'MyService', ($http, $rootScope) ->
  myData = {}
  service =
    getData: ->
      myData

    setData (val) ->
      myData = val
      $rootScope.$broadcast('myData:updated', val)

    fetchData: ->
      $http.get "/url/to/data"

  service

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

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

希望它会帮助别人!