事件系统

事件系统允许同一进程中的应用程序组件通过发送和监听事件来相互通信。它通过在互不相识的函数之间发送消息,帮助将代码模块化。

应用程序或库开启了在某个时间点执行额外功能的可能性。这些额外的函数将自己注册为所谓的事件监听者。

一个事件可以是多层面的。

  • 申请书上升或下降。

  • 一个新的用户已经被创建或删除。

  • 抛出了一个错误。

  • 有一个新的HTTP请求进来了。

Deepkit框架及其库已经提供了各种事件,用户可以对其进行监听和反应。然而,可以创建任何数量的自定义事件,使应用程序可以模块化扩展。

下面是`@deepkit/event`的低级API的一个例子。如果使用Deepkit Framework,事件监听器的注册不是直接通过`EventDispatcher’而是通过模块完成的。

import { EventDispatcher, EventToken } from '@deepkit/event';

const dispatcher = new EventDispatcher();
const MyEvent = new EventToken('my-event');

dispatcher.listen(MyEvent, (event) => {
    console.log('MyEvent triggered!');
});
dispatcher.dispatch(MyEvent);

Installation

由于Deepkit的事件系统是基于运行时类型的,因此有必要正确安装`@deepkit/type`。参见运行时类型安装

如果这样做成功了,就可以安装`@deepkit/event`或者已经在引擎盖下使用该库的Deepkit框架。

npm install @deepkit/event

请注意,控制器API的`@deepkit/event`是基于TypeScript装饰器的,一旦使用控制器API,就必须用`experimentalDecorators`相应地启用这一功能。

文件:tsconfig.json

{
  "compilerOptions": {
    "module": "CommonJS",
    "target": "es6",
    "moduleResolution": "node",
    "experimentalDecorators": true
  },
  "reflection": true
}

一旦库被安装,可以直接使用其中的API。

事件标志

事件系统的核心是事件令牌。它们是定义唯一事件ID和事件类型的对象。一个事件可以被触发,一个事件可以通过一个事件标记被监听。从概念上讲,触发事件令牌事件的人也是这个事件令牌的所有者。事件标记决定了在事件中哪些数据是可用的,以及是否允许异步事件监听器。

const MyEvent = new EventToken('my-event');

TODO异步

事件类型

TODO

传播

TODO.event.stop()

依赖注入

TODO