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