AngularJS 服务相互注入导致无限循环

AngularJS Services injecting each other causing infinite loop

我目前正面临申请中的噩梦。我有 1 个服务和 1 个工厂,它们需要相互访问,如下所示:

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

这导致我的应用程序中断(但控制台上没有错误)。我不知道发生了什么,我需要互相交流。

有人吗?

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

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

1) 重复彼此的功能,使它们不再相互依赖。

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

3) 将功能拆分成更多 services/factories 以打破循环依赖。

你创建的循环依赖是错误的。

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

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

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

我曾经有过循环依赖:这是因为 $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 作为调解器。这很公平。