NestJS SSE - 从客户端角度来看,使用 Interval 和 fromEvent 有什么区别?

问题描述 投票:0回答:1

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 });
            }),
        );
    }
rxjs nestjs server-sent-events
1个回答
0
投票

如果我没记错的话,

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
路线上它们也具有不同的值。

© www.soinside.com 2019 - 2024. All rights reserved.