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

Javascript AngularJS服务相互注入导致无限循环,javascript,angularjs,dependency-injection,angularjs-service,angularjs-factory,Javascript,Angularjs,Dependency Injection,Angularjs Service,Angularjs Factory,我目前在应用程序中面临着一个噩梦。我有1个服务和1个工厂,它们需要相互访问,如下所示: // Dependency Injection MyFactory(MyService) MyService(MyFactory) 这使得我的应用程序中断(但在控制台上没有错误)。我不知道发生了什么,我需要和对方沟通 有人吗?撇开递归算法不谈(我假设你这里没有处理递归),你不能有循环依赖,这不是角度限制 在没有看到代码的情况下,我会说你有几个选择 1) 从一个到另一个重复功能,使它们不再相互依赖 2)

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

// Dependency Injection   
MyFactory(MyService)
MyService(MyFactory)
这使得我的应用程序中断(但在控制台上没有错误)。我不知道发生了什么,我需要和对方沟通


有人吗?

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

在没有看到代码的情况下,我会说你有几个选择

1) 从一个到另一个重复功能,使它们不再相互依赖

2) 将两种服务结合起来(可能不可能或不合适)


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

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

在没有看到代码的情况下,我会说你有几个选择

1) 从一个到另一个重复功能,使它们不再相互依赖

2) 将两种服务结合起来(可能不可能或不合适)


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

您创建的循环依赖是错误的

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


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

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

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


为了解决这个问题,你可以使用第三个服务,它可以用作中介。人们常说,循环依赖是一个设计问题,这是事实,但有时处理它更简单。然而,有些情况下,如果你不能控制它,你会有一个特别的

我曾经有一个循环依赖:这是因为$http拦截器上的配置使用$stateofUI路由器重定向到登录页面。ui路由器对$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中不需要它们)


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

人们常说循环依赖是设计的问题,这是事实,但有时处理它更简单。然而,如果没有CONTROL,有些情况下会让你有一个特别的中介好吧

我曾经有过一个循环依赖关系:这是因为$http拦截器上的配置使用ui路由器的$state重定向到登录页面。ui路由器对$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中不需要它们)


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

因为我记得angularjs 1中不允许循环依赖,所以它抛出了一个错误。不久前,我遇到了同样的问题,并通过将我的服务拆分为更多的小部分解决了这个问题这是一篇关于循环依赖的有趣文章,因为我记得angularjs 1中不允许循环依赖,它抛出了一个错误。不久前,我遇到了同样的问题,并通过将我的服务拆分为更多的小部分解决了它。这是一篇关于循环依赖的文章,H你试过创建第三个服务/工厂吗?这是一篇关于循环依赖的有趣文章