Angular框架里两个模块的互相依赖
如果把思路放宽一点,把狭义的死锁场景中对资源的并发请求,拓宽到编程中的依赖管理,那么我们可以构造一个循环依赖的场景,即模块A和模块B互相依赖。
可以很容易地用一个不到20行的Angular应用来模拟循环依赖的场景。
<html ng-app="test"> <head> <title>Angular Circular Dependency Example</title> </head> <body ng-controller="testController"> Test </body> <script type="text/javascript"> var module = angular.module('test', []); module.service('service1', function(service2) {}); module.service('service2', function(service1) {}); module.controller('testController', function(service1) {}); </script> </html>
执行这个Angular应用,遇到Angular框架报的错误信息:
VM17 angular.js:14802 Error: [injector:cdep]Circulardependencyfound:service1<−service2<−service1http://errors.angularjs.org/1.6.9/injector:cdep] Circular dependency found: service1 <- service2 <- service1 http://errors.angularjs.org/1.6.9/injector:cdep]Circulardependencyfound:service1<−service2<−service1http://errors.angularjs.org/1.6.9/injector/cdep?p0=service1%20%3C-%20service2%20%3C-%20service1
at VM17 angular.js:116
at getService (VM17 angular.js:5041)
at injectionArgs (VM17 angular.js:5074)
at Object.instantiate (VM17 angular.js:5120)
at Object. (VM17 angular.js:4955)
at Object.invoke (VM17 angular.js:5108)
at Object.enforcedReturnValue [as $get] (VM17 angular.js:4939)
at Object.invoke (VM17 angular.js:5108)
at VM17 angular.js:4893
at getService (VM17 angular.js:5049)
按照在代码中的出现顺序,首先执行service1的注入。既然是第一次注入,因此代码第5039行cache里肯定不存在service1对应的实例,所以进入5045行的else分支,调用factory方法进行service1的实例化。
因为service1依赖于service2,所以service1实例化的时候触发了service2的实例化:
而service2又依赖于service1,此时Angular在cache里检测到service1还处于正在实例化的阶段,为了避免这种循环依赖,Angular框架直接报exception.
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
- 点赞
- 收藏
- 分享
- 文章举报
- 深入理解 AngularJS 的 Scope
- AngularJS入门教程:日期格式化
- angularjs ui-view替换掉父标签
- 求助angular.js
- angularjs出现[ng:areq]错误
- angularJS可以实现常常看到购物车中的升序降序效果
- angular2 tutorial
- 安装typescript和angular以及相关环境变量配置
- angularjs 日期格式化
- Angular js 学习之filter 过滤器
- Angular路由参数传递
- Angular学习笔记—Rxjs、Promise的区别
- Angular学习笔记—创建一个angular项目
- Angular学习笔记—基础(转载)
- Angular4中常用管道(转载)
- 《AngularJS》5个实例详解Directive(指令)机制
- angularJs 变量会有类型之分
- 前端随心记---------AngularJS 基础学习1.0
- AngularJS 创建一个简单可交互的控件(一)
- [AngularJS] 理解AngularJS Directive中的Scope