我有WebSocket服务器、Apollo客户机/服务器和RxJS来检测我的环境中的变化,还有一个订阅该websocket的服务:
//会话服务
private sessionsSubject = new BehaviorSubject<Array<Session> | null>(null);
public sessions$ = this.sessionsSubject.asObservable();
constructor(private apollo: Apollo) {this.subscribeToSessions()}
public subscribeToSessions(): void {
this.apollo.subscribe<SessionCreated>({
query: sessionOperations.CREATE_SESSION_SUBSCRIPTION
}).subscribe(async ({data}) => {
this.sessions$.subscribe({
next: (sessions) => this.setSessions([...sessions??[], data!.sessionCreated]),
complete: () => console.log('complete')
})
})
}
public setSessions(sessions: Array<Session>): void {
this.sessionsSubject.next(sessions)
}
}
如果添加了一个新的会话,则会调用我订阅的sessionOperations.CREATE_SESSION_SUBSCRIPTION
查询。在订阅中,我想用新创建的会话更新会话。
但是 * 我认为 * 这会导致一个无限循环。因为这也会更新sessions$
可观察值,它会再次运行会话的添加。
2条答案
按热度按时间qybjjes11#
你处在一个无限循环中,因为在订阅中,你调用了订阅的可观察对象上的next,并导致
Maximum call stack size exceeded
。this.setSessions([...sessions??[], data!.sessionCreated])
应该替换对行为主体的整个预订,使得仅将外部预订推入行为主体而不触发无限循环。34gzjxbg2#
这里的答案〉How to avoid Maximum call stack size exceeded in Observable?与我相关:
添加
take(1)
解决了我的问题。take操作符允许我们指定在取消订阅之前我们想从Observable接收多少个值,这意味着当我们接收到指定数量的值时,take会自动取消订阅!