Angular2 -如何关闭WebSocketSubject底层套接字

qmb5sa22  于 2024-01-09  发布在  Angular
关注(0)|答案(5)|浏览(143)

有没有办法获得WebSocketSubject订阅的套接字?
当某种情况发生时,我需要关闭底层套接字。
我尝试通过complete()关闭它,但它没有关闭套接字。取消订阅也不起作用。
有人能帮我吗?或者给我指个路?

50pmv0ei

50pmv0ei1#

更准确的方法是在WebSocketSubject上调用complete()。但还有一个解决方案。您可以使用这样的代码获得套接字。这很糟糕,但也很有效。

var wrapper: any = subject;
wrapper._socket.close();

字符串

wbrvyc0a

wbrvyc0a2#

您可以使用退订方法。

closeConnection(): void {
    this.socket.unsubscribe();
}

字符串
取消订阅方法实现摘录:

unsubscribe() {
    const { _socket } = this;
    if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
      _socket.close();
    }
    this._resetState();
    super.unsubscribe();
  }

ff29svar

ff29svar3#

您可以直接在取消订阅所有观察者的WebSocketSubject示例上调用unsubscribe()

const subject = Observable.webSocket(...);

...

subject.unsubscribe();

字符串
参见源代码:https://github.com/ReactiveX/rxjs/blob/master/src/observable/dom/WebSocketSubject.ts#L269

b09cbbtk

b09cbbtk4#

他说退订不了,我确实也有同样的问题,我在退订,没有关闭。
最后我直接使用了WebSocket而不是WebSocketSubject,这样我就可以调用close方法(这是有效的)。

this._ws = new WebSocket(this.url);
         this.messages = Observable.create((observer) => {
             this._ws.addEventListener('message', (message) => (
                // Et on ajoute chaque message dans l'Observable
                observer.next(message)
              ), false);

              // On s'enregistre au erreurs qui surviendraient
              // dans la websocket
              this._ws.addEventListener('error', (error) => {
                // Si un erreur est survenue, on prévient
                // l'Observable
                console.log('error ws');

                observer.error(error)

              }, false);

              // On s'enregistre à la fermeture du websocket
              this._ws.addEventListener('close', () => {
                // On met fin à l'Observable
                observer.complete()

                console.log('complete');
              }, false)
         })
    ... 

    public close() {
        console.log('on closing WS');
        this._ws.close()
    }

字符串
我跟着这个tuto Introduction à RxJSthis one
如果您在服务器关闭WS后重新连接,请也将其发布。
谢谢

neekobn8

neekobn85#

为了正确断开套接字连接,您应该取消订阅websocketsubject本身,而不是它的订阅:https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L295

相关问题