【问题标题】:Hold a service's initialization until all promises are resolved保持服务的初始化,直到所有的承诺都得到解决
【发布时间】:2012-12-31 07:35:17
【问题描述】:

routeProvider 中,如果我们给出一个包含promise 的resolve 对象,我们可以持有routing;它会等到所有的承诺都得到解决。但是,我在应用程序的初始化中找不到方法。

angular.module("app", []).run(function (){ //init app }),但对于异步的$resource$http,应用程序可以在解决依赖关系(承诺)之前完成初始化,这将创建一个race condition。我们不希望这样。

所以问题是,有没有一种方法可以保持service 的初始化,直到所有给定的承诺都得到解决?

【问题讨论】:

  • 你不想Manual Initialization吗?
  • 将回调设置为手动初始化 Promise 会起作用,但是它并不优雅,Angular 有一个很好的 DI,为什么我们不能从中受益呢?就像如果依赖是一个promise,在继续之前解决它
  • 由于您没有包含 yourj 应用程序的实际代码,我无法确定,但我认为这个问题涵盖了同样的问题:stackoverflow.com/questions/12265565/…
  • 不,我想保留服务的初始化,直到承诺得到解决,这是一个通用问题,不需要来源。
  • 如果您从run 中运行$timer,它将通过.call() 保持其状态,所以我认为这可能是最优雅的。等待向run() 发出信号的承诺,它们已解决,它会取消$timer。文档似乎使这听起来像他们想要的那样工作。

标签: javascript angularjs


【解决方案1】:

我见过类似的问题。一个队友采用的一个有点优雅的解决方案是结合 RequireJS 和它的 domReady 模块:

define(['require', 'angular', 'app','routes', 'pendingServices'], 
      function (require, ng, app, pendingServices) {


  /* place operations that need to initialize prior to app start here
   * using the `run` function on the top-level  module
   */
  app.run(pendingServices.init)

  require(['domReady!'], function (document) {
      /* everything is loaded...go! */
      ng.bootstrap(document, ['mainModule']);
  });

});

在 init 方法中,您可以执行所有预加载(并等待所需的承诺)。当然,我很想听听其他解决方案。

【讨论】:

  • 为什么要使用 domReady? angular 有自己的 angular.element(document).ready() 函数(它是 jQueryLite 的包装器)。
  • domReady 不是必需的,但是使用 RequireJS 会更简洁一些,仅此而已。
  • 但这将如何运作? 'pendingServices' 是一个使用 $timeout 加载其内容的模块吗?
  • 它使用 $q,但可以使用 $timeout 使其工作。我会在问题中添加更多细节,目前还不清楚。
  • 延迟应用程序引导似乎是一个不错的解决方法;至少在这种情况下,但我仍然喜欢使用 DI。我将把问题留待更多时间,也许会出现更好的解决方案。
【解决方案2】:

只是在这里考虑负载,但是只声明 1 条“catch all”路由开始,然后在该路由提供程序中,保持路由的加载,直到您完成所需的一切。 (使用解决和承诺)。

然后,完成后,注册剩余的路线,并重新加载原始路线。这一次,应该注册一个更具体的处理程序,它会绕过你的'catch all'初始化程序。

你怎么看,有什么问题吗?

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 2018-06-26
    • 2015-10-19
    • 2022-01-16
    • 2017-05-25
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多