Javascript RxJS在没有订阅服务器时处理资源,在新订阅服务器时创建

Javascript RxJS在没有订阅服务器时处理资源,在新订阅服务器时创建,javascript,socket.io,rxjs,Javascript,Socket.io,Rxjs,我想在有订阅者时创建并保留一个套接字,在不再有订阅者时断开连接,在订阅者返回时重新连接 这是我到目前为止的情况,但当订户取消订阅时,每个人的套接字都会断开 constructor() { this.socket = io(this.URL) } public getValue(): Observable<string> { let observable = new Observable<string>(observer => {

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

这是我到目前为止的情况,但当订户取消订阅时,每个人的套接字都会断开

  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
  }
constructor(){
this.socket=io(this.URL)
}
public getValue():可观察{
让可观察=新可观察(观察者=>{
this.socket.on('value',(数据)=>{
设v=数据[‘值’];
观察员:下一(五)
})
return()=>{
this.socket.disconnect()
}
})
可观测回波
}

这并不是你想要的,因为你每次调用
getValue()
都在创建一个新的可观察对象。例如,当您两次调用
getValue()
并订阅这两个函数时,您将拥有两个不同的观察值。然后,如果您取消其中任何一个的订阅,您将关闭使用它的每个可观察对象的套接字连接

因此,更好的方法是将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$;
}
private socket$:Observable=新的Observable(
观察员=>{
this.socket.on('value',(数据)=>{
设v=数据[‘值’];
观察员:下一(五);
});
return()=>this.socket.disconnect();
})
.share();
public getValue():可观察{
返回此.socket$;
}

这似乎比我现在尝试的要简单得多:)一些订阅者使用throttleTime,共享observable开始让事情变得有点滑稽。这是否意味着我必须为每个应用程序创建新的可观察对象?我不知道你的应用程序应该做什么或不应该做什么,也不知道你在哪里使用
throttleTime
。基本上,一些订阅者会这样做:
getValue().throttleTime(1000)
getValue().delay(3000)…someThing()…delay(3000)…someThing()。现在它的行为就像
.delay(3000)…delay(3000)…someThing()…someThing()
。换句话说,延迟在一开始就被捆绑在一起,而所有其他操作都会同时发生。这是一种非常奇怪的行为,我尝试为每次调用
getValue()
创建一个新的可观察对象(订阅套接字并在每次收到新值时调用
next
),但同样的问题发生了。。。但我最初的实现并没有这样做。好吧,这是一个非常奇怪的行为,可能超出了这个问题的范围。但事实上,这款RxJS非常好。。。在切换到此实现后,Angular决定不按时更新其数据绑定。我甚至不知道这怎么可能