【发布时间】:2017-08-08 14:13:01
【问题描述】:
我正在尝试创建一个使用 websockets 的应用程序,但我遇到了可怕的“多连接”问题,每次重新加载页面而不是关闭并重新打开一个新的 websocket 时,只是将另一个连接添加到列表中。我的问题是,是否有人知道从 Angular 2/4+ 关闭 Socket.io websocket 的最佳/正确方法。
这是我所拥有的代码:
service.ts
getUserSocket(userID: string): Observable<any> {
return new Observable(_Observer => {
// Setup the socket namespace subscription
this.UserSocket = io(NTC_API_URL + `/user/${userID}`, { secure: true });
this.UserSocket.on('message', _Message => {
console.log(_Message);
})
})
}
closeUserSocket() {
this.UserSocket.disconnect();
this.UserSocket.close();
}
component.ts
ngOninit() {
// Setup the User Socket
this.UserSocket = this._UsersService.getUserSocket(this.currentUser.userID)
.subscribe(_UserSocketMessage => {
console.log(_UserSocketMessage);
})
}
ngOnDestroy() {
this.UserSocket.unsubscribe();
this._UsersService.closeUserSocket();
}
这似乎不起作用,因为我仍然可以通过登录应用程序来观察连接堆积,我已确认调用要销毁的组件。
我尝试的另一个选项是使用once 侦听器而不是on 侦听器,它有效,但我不确定副作用,并阅读了几个地方,它不一定是不关闭连接的修复,我能理解。
【问题讨论】:
-
.disconnect方法应该用一个布尔值调用,该值指示是否关闭底层连接。所以你应该试着打电话给.disconnect(true)。参考:stackoverflow.com/a/31349392/5619416 -
你确定吗?我的智能感知对我大喊大叫,因为 disconnect() 方法不接受任何参数。
-
啊,我想你指的是
server方法而不是client方法。客户端正在 Angular 端使用。 -
另一种选择可能是在 observable 上使用 takeUntil() 方法,但我只是不确定在知道何时关闭订阅方面我将基于什么声明。
-
啊,对不起。我认为客户端和服务器端的方法签名是相同的。好吧,据我所知,
.disconnect()和.close()应该可以完成这项工作,但是,为了它,您可以尝试从客户端发出一个特殊事件,例如closeConnection,然后在服务器上监听并为相应的客户端调用.disconnect(true)方法。这可能行得通。
标签: javascript node.js angular sockets socket.io