非常好的问题。
事件处理程序按初始化顺序执行。
我以前没有真正考虑过这一点,因为我的处理程序从来不需要知道哪个先运行,但通过你的小提琴的外观,我可以看到处理程序的调用顺序与它们初始化的顺序相同。
在你的小提琴中你有一个控制器controllerA
这取决于两个服务,ServiceA
and ServiceB
:
myModule
.controller('ControllerA',
[
'$scope',
'$rootScope',
'ServiceA',
'ServiceB',
function($scope, $rootScope, ServiceA, ServiceB) {...}
]
);
服务和控制器都定义了事件侦听器。
现在,所有依赖项都需要在注入之前解决,这意味着这两个服务都将在注入控制器之前进行初始化。因此,服务中定义的处理程序将首先被调用,因为服务工厂是在控制器之前初始化的。
然后,您还可能会观察到服务按照注入的顺序进行初始化。所以ServiceA
之前已初始化ServiceB
因为它们是按顺序注入到控制器中的。如果您在控制器签名中更改了它们的顺序,您将看到它们的初始化顺序也发生了更改(ServiceB
出现在之前ServiceA
).
因此,在服务初始化后,控制器也会初始化,其中定义的事件处理程序也会随之初始化。
因此,最终结果是,在 $broadcast 上,处理程序将按以下顺序执行:ServiceA
处理程序,ServiceB
处理程序,ControllerA
处理程序。