【问题标题】:AngularJS Services injecting each other causing infinite loop [duplicate]AngularJS服务相互注入导致无限循环[重复]
【发布时间】:2016-05-07 04:42:39
【问题描述】:

我目前在我的应用程序中面临着一场噩梦。我有 1 个服务和 1 个工厂,它们需要相互访问,如下所示:

// Dependency Injection   
MyFactory(MyService)
MyService(MyFactory)

这使我的应用程序崩溃(但控制台上没有错误)。我不知道发生了什么,然后我需要相互交流。

有人吗?

【问题讨论】:

  • 我记得 angularjs 1 中不允许循环依赖,因此会引发错误。前段时间我有同样的问题,并通过将我的服务拆分为更多的小部分来解决它
  • 有一个good question关于这个话题,
  • 您是否尝试过创建第三个服务/工厂?这是一篇关于循环依赖的有趣读物misko.hevery.com/2008/08/01/…

标签: javascript angularjs dependency-injection angularjs-service angularjs-factory


【解决方案1】:

您创建了错误的循环依赖。

我从 AngularJS 的作者 Miško 那里找到了一个关于这个问题的 article

为了解决这个问题,你可以使用可以用作中介的第三个服务

【讨论】:

    【解决方案2】:

    除了递归算法(我假设你在这里没有处理递归),你不能有循环依赖,这不是角度限制。

    没有看到代码,我会说你有几个选择

    1) 在另一个中重复功能,因此它们不再相互依赖。

    2) 结合两种服务(可能不可行或不合适)

    3) 将功能拆分为更多服务/工厂以打破循环依赖。

    【讨论】:

      【解决方案3】:

      人们常说循环依赖是一个设计问题,这是真的,但有时处理起来更简单。但是,如果您无法控制它,有些情况会让您特别拥有一个。

      我曾经有一个循环依赖:这是因为 $http 拦截器上的配置使用 ui-router 的 $state 重定向到登录页面。并且 ui-router 对 $http 有依赖。

      因此,如果您确定自己在做什么,有几种方法

      1- 在 myService 构造函数中,调用 myFactory.setMyService(this)。

      2- 在 myService 中执行一个 getter 函数,如果它已初始化,它将查找字段 myFactory。如果不调用 $injector.get("myFactory");

      3- 对于每个需要循环依赖的函数:使用这样定义的内部函数:

      this.toto = function(params){$injector.invoke(this.totoInternal, this, {params:params}};
      this.totoInternal = ['params', 'myFactory' function(params, myFactory){...}]
      

      4- 在 module.run 函数中实例化两个服务(没有它们的依赖项)并为每个服务设置一个字段:

      module.run(myService, myFactory){
          myService.setMyFactory(myFactory);
          myFactory.setMyService(myService);
      }
      

      第 1 点和第 2 点只能在其中之一中完成。 第 3 点必须用于两者/ 第 4 点是在您需要实际服务之前设置依赖项(希望您在之前运行的 module.run 中不需要它们。

      编辑:关于在接受的答案中用作中介的第 3 方服务 -> 我更喜欢使用 $injector 作为中介。这很公平。

      【讨论】:

        猜你喜欢
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-12
        相关资源
        最近更新 更多