Javascript 关于websocket和Location.replace的问题

Javascript 关于websocket和Location.replace的问题,javascript,websocket,deno,Javascript,Websocket,Deno,我尝试使用Deno ws重新加载文档,但在第二次重新加载后将抛出错误 uncaughtconnectionreset:Socket已关闭抛出新的Deno.errors.ConnectionReset(“Socket已关闭”) var ws=new-WebSocket(“ws://127.0.0.1:8080/ws”) ws.onopen=函数(){ ws.send('ws-open') log('ws-open'); } ws.addEventListener(“消息”,(e)=>{ 如果(例如

我尝试使用Deno ws重新加载文档,但在第二次重新加载后将抛出错误
uncaughtconnectionreset:Socket已关闭抛出新的Deno.errors.ConnectionReset(“Socket已关闭”)

var ws=new-WebSocket(“ws://127.0.0.1:8080/ws”)
ws.onopen=函数(){
ws.send('ws-open')
log('ws-open');
}
ws.addEventListener(“消息”,(e)=>{
如果(例如,数据=='fileUpdate'){
//ws.send('close')
location.replace(location.href);
}
})
似乎
location.replace(location.href)
引发错误 有解决方案吗?

以下是Deno代码:

从导入{Application}”https://deno.land/x/abc/mod.ts"; 
从“”导入{acceptWebSocket}https://deno.land/std@0.51.0/ws/mod.ts”;
新应用程序()
.file(“/”,“/index.html”)
.file(“/module.js”,“/module.js”)
//.file(“sw.js”、“ServiceWorker.js”)
.get('/ws',异步(c:any)=>{
const{conn,header,r:bufReader,w:bufWriter}=c.request;
const ws=等待接受WebSocket({
康涅狄格州,
标题,
布弗瑞德,
布弗雷特,
});
等待(持续时间){
如果(e==‘关闭’){
ob.remove(“文件更新”)
持续
}
ob.on(“文件更新”,()=>{
发送(“文件更新”)
})
}
})
.start({端口:8080})
ob
像这样:

Ob类{
私人列表:债务人[]=[]
发送(事件:字符串){
this.list.forEach((e:ObList)=>{
如果(如事件===事件){
e、 cb&e.cb()
}
})
}
on(事件:字符串,cb:函数){
this.list.push({event,cb})
}
删除(事件:字符串){
this.list=this.list.filter((e:ObList)=>{
返回e.event!==事件
})
}
}

框架是

发生错误是因为您在关闭套接字后发送了一条消息

执行时:
location.replace(location.href)页面刷新,当前套接字关闭

您可以捕获错误,或者在发送消息之前检查ws.isClosed

等待的
(持续时间){
如果(e==‘关闭’){
ob.remove(“文件更新”)
持续
}
ob.on(“文件更新”,()=>{
console.log('sending')
如果(!ws.isClosed)
发送(“文件更新”)
})
}
虽然这将修复错误,但无法修复原因。您的
ob.on('fileUpdate')
事件在套接字关闭后触发。您应该在WebSocket close事件上清除该侦听器,您可以使用
ws.isWebSocket CloseEvent

import{acceptWebSocket,isWebSocketCloseEvent}from“https://deno.land/std@0.51.0/ws/mod.ts”;
/* ... */
等待(持续时间){
if(isWebSocketCloseEvent(e)| | e==='close'){
//这里没有听众
ob.remove(“文件更新”)
//如果e=='close',您可能需要关闭套接字
}
}

如果没有服务器端代码,就无法复制。请出示您的Deno代码。因为看起来你试图关闭套接字两次。该代码无效。如果没有,很难帮助您。我在脚本中使用ESmodule,如果我不重新加载。如果代码无法编译,请显示我们可以运行的完整服务器代码。给我发一份
gist
,我会查出来,或者在这里更新。这里是我的答案。顺便说一句,你应该用代码更新你的问题,而不是将代码作为答案发布(除非它实际上是一个答案)