javascript - 如何以 Angular 异步初始化应用程序

标签 javascript ajax angularjs asynchronous initialization

我正在编写一个 Angular 应用程序,需要一些异步代码才能在引导阶段运行。假设此 pahe 包括收集多个 AJAX 调用响应。当请求资源时,会显示一个覆盖图标(等待数据)。完成所有请求后,应用程序就可以开始工作了。问题是:如何在 Angular 中正确执行此操作?

到目前为止我在网络上发现的东西似乎都很hacky,例如:

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

最佳答案

您无需延迟启动应用程序。

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

与此类似的东西:

<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 请求以及如何从“正在加载”状态更改为“就绪”状态。使用 $rootScope 作为跨 Controller 共享数据的方式通常不受欢迎。

关于javascript - 如何以 Angular 异步初始化应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28921181/

相关文章:

javascript - 与 Angular 同步事件(如线程 'join()' 函数)

javascript - 我可以连接到外部服务器并更改我的显示页面吗

javascript - Angularjs ng-repeat 索引不起作用

javascript - 如何知道浏览器是否嵌入到其他应用程序中?

javascript - 对象不支持属性或方法 'format' IE7/8

javascript - 如何在ajax请求中停止setTimeout

javascript - AJAX 异步请求无法正常工作

javascript - Angular ui.router 设置祖先状态命名 View

javascript - 使用哈希打开 shadowbox.js 弹出窗口

javascript - Facebook js sdk 无法检索登录用户的名称