AngularJS调用EQUEUE和configBlocks

AngularJS调用EQUEUE和configBlocks,angularjs,Angularjs,AngularJs源代码深度挖掘-在AngularJs引导期间,invokeQueue和configBlocks做什么?我看到它们被传递给runInvokeQueue函数中loadModules的参数 configBlocks存储模块配置期间实例化的服务列表: angular.module("ng")._configBlocks[0][0] invokeQueue存储加载模块后调用的方法列表: var foo = angular.module("ng"); foo.constant(alert

AngularJs源代码深度挖掘-在AngularJs引导期间,
invokeQueue
configBlocks
做什么?我看到它们被传递给
runInvokeQueue
函数中
loadModules
的参数

configBlocks
存储模块配置期间实例化的服务列表:

angular.module("ng")._configBlocks[0][0]
invokeQueue
存储加载模块后调用的方法列表:

var foo = angular.module("ng");
foo.constant(alert)
foo._invokeQueue[0]
foo._invokeQueue[0][2][0]
模块
定义位于AngularJS源代码的第一行。正如文档所述,每个
模块的寿命可分为两个阶段。
config
阶段和
run
阶段。通过调用angular.module()构造函数公开的对象为我们提供了这两种方法。run方法的功能在源代码之外非常明显。它只是将
config
函数传递到
run
块的私有列表中。相反,
config
方法并不那么明显。下面是
config
方法的作用:

invokeLater
private方法将
provider
及其方法的组合插入内部模块队列,以便稍后在注入器实例化期间调用。如果没有喷油器,模块将完全无用。
CreateInjector
函数是具体的实现,它具有私有方法
loadModules

除其他功能外,
loadModules
功能用于启动传递给它的模块。它返回相互依赖的所有模块的所有
run
块的一个数组。喷油器通过其
invoke
方法调用它们。最后但并非最不重要的一点是,
loadModules
函数在迭代所有相关模块期间,分别调用存储在
\u invokeQueue
\u configBlock
中的函数。在最后一个位置调用
run
块。这意味着模块的所有服务和方法都已经公开并准备好使用。相反,
config
方法仅适用于模块公开的提供程序。提供程序的构造函数存储在模块的
\u invokeQueue

两个喷油器

第一个未公开的注入器是提供者的注入器。第二个是实例注入器。实例注入器向提供程序缓存请求所需的构造函数。然后它调用提供者的适当部分并创建一个实例。实例注入器在请求提供程序注入器之前在提供程序缓存中搜索。
module.provider
方法公开了provider injector的provider方法,仔细看,它说明了服务的生命周期

甚至angular构造的其他部分,如指令和控制器,也在提供程序的缓存中注册为提供程序。然后,$compileProvider本身通过
$provide.provider
方法像任何其他提供程序一样注册。事实上,
module.factory
module.service
module.provider
首先在提供程序缓存中存储一个实例。但这是我们可以利用的一个例子。实例注入器首先请求提供程序缓存,然后调用invoke方法,该方法负责处理依赖关系

参考资料