事件系统

事件机制是一种很好的应用解耦方式。CatLib事件系统让我们可以订阅和监听程序中出现的各种事件。事件系统结合服务容器,将提供更加优秀的事件处理方式。

CatLib核心已经默认提供了事件系统,供给全局事件使用。如果您要定义私有范围的事件可以这么做:

  1. var dispatcher = new Dispatcher(); // 构建一个单纯的事件调度器

名词解释

  • 载荷是指程序调用所附带的上下文信息。不同的调用者所提供的上下文信息各不相同。

注册普通监听器

通过 App.On 命令您可以注册一个事件的监听器,监听器函数会通过服务容器调用,自动解析并且注入合适的参数。

  1. App.On("event.name" , (IApplication application)=>{
  2. //todo
  3. });

除了通过lambda注册外事件监听器还能够通过对象方法注册,一共接收3个参数,第一个参数为事件名,第二个参数为触发事件后调用的对象,第三个参数为触发事件后调用对象的函数名(可选项),如果您没有传入第三个参数作为函数名,CatLib事件系统会通过字符串方法分析事件名给定一个函数名,这一特性在有完整的事件名规范时将会大大简化代码。

  1. App.On("MyEvent.CallEvent" , cls); // 分析得出的函数名 : CallEvent

注册通配符监听器

CatLib事件系统允许使用通配符*对事件进行匹配。它让你在一个监听器中可以监听到多个事件。

注意:通配符事件每次事件调用都会被依次检查,您应该控制他们在项目中的数量。

  1. App.On("event.*" , ()=>{
  2. //todo
  3. });
  4. // event.catlib
  5. // event.catlib.version

触发事件

如果要触发事件,您可以通过App.Trigger来触发事件。这个函数将会把事件分发到它所有已经注册的监听器上。因为 App 是全局可访问的,所以你可以在项目中的任何地方调用它, CatLib的将使用容器来调度到方法,这意味这您可以直接展开传入的参数。

  1. App.Trigger("event.name", /*Your params*/);

触发单次事件

通过TriggerHalt您可以限定这次事件的触发只要监听器返回了有效处理结果(不为null)那么就自动终止事件传递。

  1. App.TriggerHalt("event");

返回处理结果

您可以通过return一个对象,这个对象将会被返回给调用者。

  1. App.Listen("event" , ()=>{
  2. return "call complete";
  3. });
  4. App.Listen("event.*" , ()=>{
  5. return "call all";
  6. });
  7. App.TriggerHalt("event"); // call complete
  8. App.Trigger("event.name"); // object[]{ "call complete" , "call all" }

监听器是否存在

您可以通过HasListeners来判断事件监听器是否存在,该方法接收两个参数,第一个参数为事件名,第二个参数为是否进行严格匹配(可选), 如果进行严格匹配那么将禁用通配符匹配。

  1. App.Listen("event.*" , ()=>{
  2. return "call complete";
  3. });
  4. App.HasListeners("event.name", false); // true
  5. App.HasListeners("event.name", true); // false
  6. App.HasListeners("event.*", true); // true

终止事件传递

CatLib事件系统支持返回一个false来终止事件的传递。

  1. App.Listen("event" , ()=>{
  2. return false;
  3. });

解除监听器

您可以通过Off方法来解除事件监听器,该方法支持三种解除方式:

  • 如果传入的是字符串(string)将会解除对应事件名的所有事件
  • 如果传入的是事件对象(IEvent)那么解除对应事件
  • 如果传入的是其他实例(object)会解除该实例下的所有事件
  1. var handler = App.On("event.*" , (payload)=>{
  2. //todo
  3. });
  4. App.Off(handler);