Angular2 - 如何关闭 WebSocketSubject 底层套接字
Posted
技术标签:
【中文标题】Angular2 - 如何关闭 WebSocketSubject 底层套接字【英文标题】:Angular2 - How to close WebSocketSubject underlying socket 【发布时间】:2017-11-17 17:43:33 【问题描述】:有没有办法获取WebSocketSubject订阅的socket?
当某种情况发生时,我需要关闭底层套接字。
我尝试通过 complete() 关闭它,但它没有关闭套接字。退订的也不行。
有人可以帮我吗?或者指出我正确的方向?
【问题讨论】:
【参考方案1】:他说取消订阅不起作用。确实我有同样的问题。我正在取消订阅,它没有关闭。
我最终直接使用 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()
我关注这个教程Introduction à RxJS和this one
如果您在服务器关闭 WS 后设法重新连接,请同时发布。
谢谢
【讨论】:
我找到了一种重新连接并知道服务器是否死机的方法。在几天前我问自己的另一个问题中,我让你回答了。 ***.com/a/49316097/1966439【参考方案2】:为了获得正确的套接字断开连接,您应该取消订阅 websocketsubject 本身,而不是订阅:https://github.com/ReactiveX/rxjs/blob/master/src/internal/observable/dom/WebSocketSubject.ts#L295
【讨论】:
【参考方案3】:更准确的方法是在WebSocketSubject
上致电complete()
。但还有另一种解决方案。您可以使用这样的代码获取套接字。这很糟糕,但也可以。
var wrapper: any = subject;
wrapper._socket.close();
【讨论】:
【参考方案4】:您可以直接在取消订阅所有观察者的WebSocketSubject
实例上调用unsubscribe()
:
const subject = Observable.webSocket(...);
...
subject.unsubscribe();
查看源码:https://github.com/ReactiveX/rxjs/blob/master/src/observable/dom/WebSocketSubject.ts#L269
【讨论】:
以上是关于Angular2 - 如何关闭 WebSocketSubject 底层套接字的主要内容,如果未能解决你的问题,请参考以下文章
angular2项目在firefox上加载时websocket中断
Angular2 - 如何关闭 WebSocketSubject 底层套接字