Saga 可以订阅监听应用里发生的事件,然后可以做出不同的反应,在 Saga 里面可以使用 rxjs 提供的各种操作员方法处理事件,可以在 Saga 里执行新的命令。
在 user 模块里面,新建一个文件,放在 sagas 里面,名字可以随便定义,比如 user.saga.ts,在这个文件里可以定义一个类,类里面添加一些 Saga 方法,它们可以去订阅处理事件流。
export 一个 class,名字可以叫做 UserSaga,在这个类的上面,添加一个 @Injectable 装饰器,它来自 @nestjs/common。
打开 UserModule 模块,在模块里配置一个 Provider,添加一个 UserSaga。
回到 UserSaga 类,在这个类里面可以定义一些 Saga 方法,添加一个方法,名字是 demoSaga,让这个方法变成一个 Saga 方法,需要在方法的上面,用 Saga 装饰器装饰一下。
这样这个方法里面可以接收一个事件流参数,名字是 events$,因为它是一个 Observable ,所以名字后面一般会加上 $ 后缀。类型是 Observable any 。
在方法里面,return 的是,用一下 events$ 这个事件流,应用里发生的事情都会出现在这个事件流里面,它是一个 Observable,所以可以使用 pipe 方法,接上一个管道,然后在这个方法里,可以使用 rxjs 提供的一些操作员方法去处理这个事件流上的事件。
可以先用一个 map 操作员,它来自 rxjs/operators,在文件顶部,从这个 rxjs/operators 里面导入一些操作员,先导入一个 map。
然后给这里用的这个 map 提供一个函数参数, 这个函数可以有个 event 参数,这里这个 event 就是 events$ 事件流上的事件。用一下 console.log 输出一个 DemoSaga: 后面再加上这个 event 参数的值。
rxjs 提供了大量的操作员方法可以使用各种方法处理数据流,比如我想延迟一点时间再在控制台上输出这个事件流里的事件,上面可以再添加一个 delay 操作员,它的参数设置成 3000,意思就是延迟 3 秒钟。
测试
打开一个 Http 客户端,再用 POST 方法带着 JSON 数据请求一下 users 这个接口。打开运行项目的终端观察一下。
过了一会儿,会输出一个 DemoSaga,后面是一个 UserCreatedEvent 事件,请求接口,执行了一个 CreateUser 命令,在这个命令的处理器那里会发布一个 UserCreatedEvent 事件,我们定义的 Saga 里面,可以获取到事件流。
demoSaga 做的事情就是,延迟了 3 秒钟,然后在控制台上输出 DemoSaga,冒号,后面是事件流上的事件。