选择选项时关闭多个 WebSockets 连接

close multiple websockets connections when option selected

本文关键字:WebSockets 连接 选项 选择      更新时间:2023-09-26

我有一个文本框,用户可以在其中开始输入字母。如果数据库中有相对单词,它们将显示在文本框下方的dropdown中。

为了搜索数据库并返回结果,我使用 websockets(nodejs 0.10.12 和 javascript)

所以代码是这样的

//something is typed , so call the function, to send data and make query
<input id="typename" type="text"  onKeyUp="lookup();" >

//this is where I send data and get back results
function lookup(){
  var so=new WebSocket("ws://localhost:1234");
  so.onerror=function (evt) {alert('Error');}
  so.onopen=function(){
     so.send(document.getElementById("typename").value) 
  }
  so.onmessage = function (evt) {
      var received_msg = evt.data;
      var packet = JSON.parse(received_msg);
      so.close();   
      //feed results to dropdown.....
  }
}

这转化为多个连接作为用户类型打开和关闭。

即使用户从下拉列表中选取某些内容,连接仍会在后台打开和关闭。因为如果我输入例如 4 个字母,则打开/关闭将是 4。

如果我立即选择我想要的东西,后台仍然有 2 或 3 个连接,打开和关闭。他们仍然提供结果。这意味着,实际上,不要让我选择我想要的。我必须一遍又一遍地选择它。(下拉闪烁)如果我编辑它并想将其保存回数据库,我不能,因为仍然有连接正在运行,所以我无法打开一个新的来保存它。代码等待...

我怎样才能做类似的事情

<select id="listout" size="5"  onChange="so.close();"  >  </select> 

停止在后台运行的连接?以上是行不通的。即使我将so设置为全局或非全局。不起作用,因为我可以看到多个连接同时打开,但没有关闭。我必须刷新页面,以便它们都可以关闭。

有什么建议吗?

当下拉列表中的某些内容发生更改时,如何关闭所有连接(= 用户选择某些内容)?

提前致谢

PS 对于巨大的介绍,我深表歉意。 思想将帮助您更好地了解问题,或提供替代方案

要关闭打开的连接,您需要在创建连接时保存指针,例如:

//global variable for store opened connections
var aPoolWSConections = []
function lookup(){
    var so=new WebSocket("ws://localhost:1234");
    //
    // your code here
    //
    // at the end
    aPoolWSConections.push(so);
}    

实现将关闭连接的函数。

function closePoolWSConections(){
    var iSo = aPoolWSConections.length;
    while(iSo--){
        aPoolWSConections[iSo].close();
    }
    aPoolWSConections = [];
}

在必要的时间调用函数。

<select id="listout" size="5"  onChange="closePoolWSConections();"  >  </select>

但我不建议您为您的应用程序打开许多连接就足够一个 websocket 连接。

//Create one global WS connection
var so = new WebSocket("ws://localhost:1234");
so.onmessage = function (evt) {
    var received_msg = evt.data;
    var packet = JSON.parse(received_msg);
    //feed results to dropdown.....
}
function lookup(){
    //maybe should check if it still open
    so.send(document.getElementById("typename").value);
}
//and you can use something like
<select id="listout" size="5"  onChange="so.close();"  >  </select>