gpt4 book ai didi

javascript - RxJS 在没有订阅者时释放资源,在有新订阅者时创建

转载 作者:行者123 更新时间:2023-11-29 15:15:47 25 4
gpt4 key购买 nike

我想在有订阅者时创建并保留一个套接字,在我不再有订阅者时断开连接,并在订阅者返回时重新连接。

这是我目前所拥有的,但是当订阅者取消订阅时,每个人的套接字都断开连接。

  constructor() {
this.socket = io(this.URL)
}

public getValue(): Observable<string> {
let observable = new Observable<string>(observer => {
this.socket.on('value', (data) => {
let v = data['value'];
observer.next(v)
})

return () => {
this.socket.disconnect()
}
})

return observable
}

最佳答案

这并没有完全按照您的意愿进行,因为您每次调用 getValue() 时都会创建一个新的 Observable。例如,当您两次调用 getValue() 并订阅它们时,您将拥有两个不同的 Observable。然后,如果您取消订阅其中任何一个,您将关闭每个正在使用它的 Observable 的套接字连接。

因此,更好的方法是将 Observable 作为一个单独的变量与 share() 运算符链接在一起,这将始终只保留对其源 Observable 的一个订阅,并在所有观察者取消订阅时取消订阅.

private socket$: Observable<string> = new Observable<string>(
observer => {
this.socket.on('value', (data) => {
let v = data['value'];
observer.next(v);
});

return () => this.socket.disconnect();
})
.share();

public getValue(): Observable<string> {
return this.socket$;
}

关于javascript - RxJS 在没有订阅者时释放资源,在有新订阅者时创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49279560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com