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()
}
5条答案
按热度按时间50pmv0ei1#
更准确的方法是在
WebSocketSubject
上调用complete()
。但还有一个解决方案。您可以使用这样的代码获得套接字。这很糟糕,但也很有效。字符串
wbrvyc0a2#
您可以使用退订方法。
字符串
取消订阅方法实现摘录:
型
ff29svar3#
您可以直接在取消订阅所有观察者的
WebSocketSubject
示例上调用unsubscribe()
:字符串
参见源代码:https://github.com/ReactiveX/rxjs/blob/master/src/observable/dom/WebSocketSubject.ts#L269
b09cbbtk4#
他说退订不了,我确实也有同样的问题,我在退订,没有关闭。
最后我直接使用了WebSocket而不是WebSocketSubject,这样我就可以调用close方法(这是有效的)。
字符串
我跟着这个tuto Introduction à RxJS和this one
如果您在服务器关闭WS后重新连接,请也将其发布。
谢谢
neekobn85#
为了正确断开套接字连接,您应该取消订阅websocketsubject本身,而不是它的订阅:https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L295