如何在 angular 中异步初始化应用程序

how to initialize application asynchronously in angular

我正在编写一个 angular 应用程序,在 bootstrap 阶段需要一些 异步 代码到 运行。假设这个 pahe 包括收集几个 AJAX 呼叫响应。在请求资源时,会显示一个叠加图标(正在等待数据)。完成所有请求后,应用程序就可以开始工作了。问题是:如何在 angular 中正确执行此操作?

到目前为止我在网上找到的东西似乎很老套,例如:

我正在寻找一种方便、干净的解决方案。例如,在 backbone(或建立在它之上的任何东西)中,你可以简单地 运行 在 initialize 中的几个 ajax 请求方法。 Backbone 毕竟依赖于 jQuery - 或者有些抱怨 - 所以只需使用 $.when(list-of-promises) 异步收集它们并触发一个将异步 bootstrap 整个应用程序的事件。这纯粹是模块化的。而且没有黑客。

您不需要延迟引导您的应用程序。

您使用 $http 服务请求数据。 $http 方法 return 承诺。您可以使用 $q 服务的 $q.all() 方法等待所有 $http 承诺都已解决。

与此类似的内容:

<body ng-app="app">
    <div ng-if="!Initialized">
        Overlay (waiting for data)
    </div>
    <div ng-if="Initialized">
        Application
    </div>
</body>


angular.module('app', [])
.run(function($rootScope, $q, $http){
    $rootScope.Initialized = false;
    $q.all({
        firstRequest: $http.get('/someresource'),
        secondRequest: $http.get('/someotherresoruce'),
        thirdRequest: $http.get('/athirdresource')
    }).then(function(results) {
        $rootScope.resource1 = results.firstRequest;
        $rootScope.resource2 = results.secondRequest;
        $rootScope.resource3 = results.thirdRequest;
        $rootScope.Initialized = true;
    });
});

注意,这是为了演示如何同时等待多个 $http 请求并从 "loading" 状态更改为 "ready" 状态。使用 $rootScope 作为跨控制器共享数据的方式通常不受欢迎。