Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在角度为2/4+;和Socket.io_Javascript_Node.js_Angular_Sockets_Socket.io - Fatal编程技术网

Javascript 如何在角度为2/4+;和Socket.io

Javascript 如何在角度为2/4+;和Socket.io,javascript,node.js,angular,sockets,socket.io,Javascript,Node.js,Angular,Sockets,Socket.io,我正在尝试创建一个使用websocket的应用程序,但遇到了可怕的“多重连接”问题,每次重新加载页面而不是关闭并重新打开一个新的websocket时,另一个连接就会简单地添加到列表中。我的问题是,是否有人知道从Angular 2/4+关闭Socket.io websocket的最佳/正确方法 以下是我所掌握的代码: 服务.ts getUserSocket(userID:string):可观察{ 返回新的可观察对象(_Observer=>{ //设置套接字命名空间订阅 this.UserSocke

我正在尝试创建一个使用websocket的应用程序,但遇到了可怕的“多重连接”问题,每次重新加载页面而不是关闭并重新打开一个新的websocket时,另一个连接就会简单地添加到列表中。我的问题是,是否有人知道从Angular 2/4+关闭Socket.io websocket的最佳/正确方法

以下是我所掌握的代码:

服务.ts

getUserSocket(userID:string):可观察{
返回新的可观察对象(_Observer=>{
//设置套接字命名空间订阅
this.UserSocket=io(NTC_API_URL+`/user/${userID}`,{secure:true});
this.UserSocket.on('message',\u message=>{
console.log(_消息);
})
})
}
closeUserSocket(){
this.UserSocket.disconnect();
this.UserSocket.close();
}
组件。ts

ngOninit(){
//设置用户套接字
this.UserSocket=this.\u UsersService.getUserSocket(this.currentUser.userID)
.subscribe(_UserSocketMessage=>{
console.log(_UserSocketMessage);
})
}
恩贡德斯特罗(){
this.UserSocket.unsubscribe();
此.u UsersService.closeUserSocket();
}
这似乎不起作用,因为我仍然可以通过登录一个我已确认的应用程序调用要销毁的组件来观察连接堆积


我尝试的另一个选择是使用
once
侦听器而不是
on
侦听器,这很管用,但我不确定副作用,并且读了好几篇文章,认为这不一定是不关闭连接的修复方法,这一点我可以理解。

经过相当多的修补和研究,我意识到web套接字是有弹性的。换句话说,由于它们被设计为在可能的情况下重新连接,因此专注于
断开
关闭
是错误的方法。执行有关创建web套接字连接的策略要容易得多

首先,我必须在服务器端重构一些东西,以确保特定名称空间只初始化一次。这与其说是通过修改初始化代码实现的,不如说是通过确保web套接字初始化只发生在启动时发生的地方,或者是在极有可能只发生一次的过程中发生,例如创建特定用户

从角度看,这也非常简单,因为我所要做的就是将套接字分配给服务中的一个属性,然后在进行套接字连接之前检查它是否存在。因此,仅在以前不存在连接的情况下创建连接

服务.ts

//设置套接字命名空间订阅
如果(!this.UserSocket){
//初始化用户权限套接字
this.UserSocket=io(NTC_API_URL+`/user/${this.LocalUser.userID}`,{secure:true});
}

应使用指示是否关闭基础连接的布尔值调用
.disconnect
方法。因此,您应该尝试调用
。断开连接(true)
。裁判:你确定吗?我的intellisense对我大喊大叫,因为disconnect()方法不接受任何参数。啊,我想你指的是
服务器
方法,而不是
客户端
方法。客户端是从角度使用的。另一种选择是在可观察对象上使用takeUntil()方法,但我不确定在知道何时关闭订阅时,我将基于什么陈述。啊,对不起。我认为客户端和服务器端的方法签名是相同的。嗯,据我所知,
.disconnect()
.close()
应该可以完成这项工作,但是,为了实现这一点,您可以尝试从客户端发出一个特殊事件,比如说
closeConnection
,然后在服务器上侦听并调用相应客户端的
.disconnect(true)
方法。那可能行得通。