RxJS在没有订阅者时处置资源,在新订阅者时创建

时间:2018-03-14 13:52:46

标签: javascript socket.io rxjs

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

这是我到目前为止所做的,但当订阅者取消订阅套接字时,每个人都会断开连接。

Add

1 个答案:

答案 0 :(得分:1)

这并不是您想要的,因为您每次拨打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$;
}