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

时间:2013-10-31 14:58:48

标签: javascript html5 node.js websocket connection

我有一个文本框,用户可以在其中输入字母。如果数据库中存在相对单词,则它们会显示在文本框下方的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个连接,打开和关闭。他们仍然提供结果。这意味着,实际上,不要让我选择我想要的东西。我必须一遍又一遍地挑选它。 (Dropdown闪烁)如果我编辑它并想将它保存回db,我不能,因为仍有连接正在运行,所以我无法打开一个新的来保存它。代码等待......

我该怎么做

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

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

有任何建议吗?

如果在下拉列表中更改了某些内容(=用户选择了某些内容),如何关闭所有连接?

提前致谢

PS我为这个巨大的介绍道歉。思想将帮助您更好地理解问题,或提供替代方案

1 个答案:

答案 0 :(得分: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>