如何在AngularJS的运行块中等待承诺?

如何在AngularJS的运行块中等待承诺?,angularjs,Angularjs,我真的需要在引导之前加载一些数据。由于这个原因,我创建了一个run块/在这个run块中,我调用了一个从服务器加载一些数据的服务方法。由于这是一个异步调用,JavaScript的执行会更进一步,这会导致我的应用程序中出现一些未定义的对象 我正在使用routes,但不能使用resolve属性 是否有人能提供一个解决方案,说明如何在运行块中等待承诺就绪 编辑: 由于给出了答案,我通过手动引导解决了这个问题: $(document).ready(function () { $.ajax('/Da

我真的需要在引导之前加载一些数据。由于这个原因,我创建了一个
run
块/在这个
run
块中,我调用了一个从服务器加载一些数据的服务方法。由于这是一个异步调用,JavaScript的执行会更进一步,这会导致我的应用程序中出现一些未定义的对象

我正在使用routes,但不能使用
resolve
属性

是否有人能提供一个解决方案,说明如何在
运行
块中等待承诺就绪

编辑:

由于给出了答案,我通过手动引导解决了这个问题:

$(document).ready(function () {
    $.ajax('/Data/GetDropdownData', {type:'POST'}).done(function (response) {
        app.run(['ListService',  function (ListService) {
            ListService.setData(response);
        }])

        angular.bootstrap(document, ["sma"]);
    })
})

正如我所评论的,我会把它放在这里

你可以试试


元素(文档).ready(函数(){
角度引导(文档);
});

当然,在这种情况下,您不能使用控制器和角度方式获取数据。我认为您必须通过jQuery加载数据,在jQuery回调中引导angular,然后使用从jQuery获得的数据初始化scope变量

我想唯一的解决方案就是你的应用程序。也许你可以在这个问题和这篇小文章中找到一些帮助

如前一篇文章所述,要进行手动引导:

angular.element(document).ready(function() {
  angular.bootstrap(document, ["myApp"]);
});
请务必删除
HTML
ng app
的所有引用,以停止自动引导。

您可能想看看这个问题-它显示了如何使用异步数据初始化AngularJS服务

是该问题中的一个plunkr示例,展示了如何使用AngularJS服务(如$http)加载配置,然后进行进一步初始化

答案有一个很好的解释,并展示了一个等待DOM加载的示例(该答案中的plunkr示例为):


另一个解决方案是,我不会对应用程序的某些部分进行ommit,但我仍然必须等待加载

引导指令(不属于twitter引导):

myApp.directive('myBootstrap',function(){
返回{
范围:{
承诺:'=myBootstrap'
},
模板:“”,
controllerAs:“ctrl”,
是的,
控制器:功能($scope){
var ctrl=this;
ctrl.isReady=false;
//否则,一系列承诺可以由一个服务来实现
$scope.promise.then(函数(){
ctrl.isReady=true;
});
}
};
});

以及相关的plnkr:

promise.then(函数(数据){$rootScope.data=data;});但我认为这太容易了,而且你也不确定自己是否准备好了controller@Whisher谢谢你的回复,但这确实不是一个选择。我真的需要在启动应用程序之前加载数据。因此,手动引导可能是一个选项angular.element(document).ready(function(){angular.bootstrap(document);});是的,正如@FedorSkrynnikov所说,手动引导是我想要的方式go@FedorSkrynnikov:谢谢您的评论,但是我应该将加载数据的代码放在哪里?标记为“应答”,因为Fedor是第一个。
angular.element(document).ready(function() {
  angular.bootstrap(document, ["myApp"]);
});
angular.element(document).ready(function() {
  angular.bootstrap(document);
});
myApp.directive('myBootstrap', function() {
  return {
    scope: {
      promise: '=myBootstrap'
    },
    template: '<div ng-if="ctrl.isReady" ng-transclude></div>',
    controllerAs: "ctrl",
    transclude: true,
    controller: function($scope) {
      var ctrl = this;
      ctrl.isReady = false;

      //else an array of promises can be filled by a service
      $scope.promise.then(function() {
          ctrl.isReady = true;
      });
    }
  };
});