AngularJs源代码深潜- invokeQueue和configBlocks在angularjs引导过程中做什么?我看到它们被传递给runInvokeQueue函数在loadModules中的参数。
发布于 2014-12-11 22:55:17
configBlocks存储在模块配置期间实例化的服务列表:
angular.module("ng")._configBlocks[0][0]invokeQueue存储模块加载后调用的方法列表:
var foo = angular.module("ng");
foo.constant(alert)
foo._invokeQueue[0]
foo._invokeQueue[0][2][0]
module定义位于AngularJS源的第一行。正如文档所述,每个module操作的生命周期可分为两个阶段。config阶段和run阶段。通过调用angular.module()构造函数公开的对象为我们提供了这两个方法。run方法的功能在源代码之外是非常明显的。它简单地将config函数传递给run块的私有列表。相反,config方法并不那么明显。下面是config方法所做的工作:invokeLater私有方法将provider及其方法的组合插入到内部模块队列中,以便稍后在注入器实例化期间调用。如果没有注射器的话,这些模块将是完全无用的。CreateInjector函数是具体的实现,它具有私有方法loadModules。loadModules函数除其他外,执行传递给它的模块的启动。它返回相互依赖的所有模块的所有run块的一个数组。注入器通过其invoke方法调用它们。最后但并非最不重要的一点是,loadModules函数在所有依赖模块的迭代过程中分别调用存储在_invokeQueue和_configBlock中的函数。在最后一个位置调用run块。这意味着模块的所有服务和方法都已经公开,可以使用了。相反,config方法只适用于模块公开的提供程序。提供程序的构造函数存储在模块的_invokeQueue中。 两个喷射器 第一个喷射器不是公开的,是供应商的注射器。第二个是实例注入器。实例注入器向提供者缓存请求所需的构造函数。然后它调用提供者的适当部分并创建一个实例。实例注入器在请求提供程序注入器之前在提供程序缓存中搜索。module.provider方法公开了提供者注入器的提供程序方法,仔细观察它可以了解服务的生命周期。 即使是角结构的其他部分,如指令和控制器,也会在提供者的缓存中注册为提供者。然后,像任何其他提供者一样,通过$compileProvider方法注册$provide.provider本身。事实上,作为第一步,module.factory、module.service和module.provider在提供者缓存中存储一个实例。但这是我们可以使用的实例喷射器。实例注入器请求提供者缓存作为第一步,然后调用invoke方法,该方法处理依赖关系。
参考资料
https://stackoverflow.com/questions/27352281
复制相似问题