0

我有一个文本框,用户可以在其中开始输入字母。如果数据库中有相关词,它们会出现在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我为巨大的介绍道歉。思想将帮助您更好地理解问题,或提供替代方案

4

1 回答 1

0

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

//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>
于 2013-11-05T22:22:30.917 回答