NestJS 中有 2 个 SSE 方法: 第一个是使用
interval
方法返回一个 observable,第二个返回一个事件的 observable (EventEmitter)。
在多个客户端连接到同一 SSE 端点的情况下,行为是不同的。 在
interval
方法中,并非所有客户端都会收到相同的消息,但在 fromEvent
observable 中,当事件被触发时,它们都会收到相同的消息。
如果这些方法都返回 Observable ,那么它们之间有什么区别?
@Sse('sse')
sse(): Observable<MessageEvent> {
return interval(5000)
.pipe(map((_) => ({ data: { hello: `world - ${this.c++}` }} as MessageEvent)),
);
}
@Sse('approvals')
public getApprovals(@Res() response: Response): Observable<MessageEvent> {
return fromEvent(this.eventEmitter, NEW_APPROVAL_EVENT_NAME)
.pipe(map((data: ApprovalDTO) => {
this.logger.log(`Event Notification - name:${NEW_APPROVAL_EVENT_NAME}, data:${JSON.stringify(data)}`)
return new MessageEvent<ApprovalDTO>('new-approval', { data: data });
}),
);
}
如果我没记错的话,
interval
将创建一个新的间隔可观察量,因此每个调用SSE /sse
的客户端将创建一个新的可观察量,每五秒发出一次hello: world - ${ this.c++ }
,这意味着this.c
可以并且将会,对于连接的客户端数量,每 5 秒增加一次以上。 fromEvent()
also 创建了一个新的 observable,但是这个 observable only 在 NEW_APPROVAL_EVENT_NAME
事件被发出时触发,所以所有客户端都会看到它同时发生。 X 客户端仍然有 X 个可观察量,但它们都使用相同的数据同时触发。如果您要向返回的对象添加类似的 this.d++
,您会发现即使在 SSE /approvals
路线上它们也具有不同的值。