在建立连接之前不断尝试重新连接

时间:2015-05-11 17:34:44

标签: node.js websocket

我试图创建一个执行以下操作的例程

while(true)
{

  cxn = connect(addr);
  if(!cxn)
  {
    sleep(1000);
    continue;
  }
  else
  {
    break;
  }
}

但是,由于我使用的NodeJS和websocket库的异步性质(ws),我似乎被迫使用回调来检测连接成功与错误。我无法弄清楚如何使其适应上面的算法,因为假设连接成功与失败的事件发生在循环内而不是绑定到异步函数。

以下是我想说明我想要提出的观点的一个例子:

while(true)
{

  cxn = connect(addr);
  cxn.on('error', function(error)
  {
    sleep(1000);
    continue; // this is invalid
  });
  cxn.on('connect', function()
  {
    break; // this is invalid
  });
}

正如你在这里看到的那样。 continue break 语句都是无效的,因为它们出现在回调函数的范围内,该回调函数不在for循环的边界内调用。

在Node和WS的异步设计下,我将如何实现所需的功能?

**编辑:**我试图修改我的代码,使其阻塞,直到建立连接。但是,我仍然无法获得连接,程序只是挂起。我假设我的 while 循环以某种方式阻止了事件循环的执行。有什么想法吗?

代码:

var WebSocket = require('ws');
var socket = null;

function try_connection(addr)
{
  var connection_status = 'CONNECTING';
  console.log("attempting to connect to web socket server...");
  socket = new WebSocket(addr);
  socket.on('error', function(error)
  {
    if(error.errno == 'ECONNREFUSED')
    {
      console.log('CONNREFUSED');
      debugger;
    }
    else
    {
      console.log('unrecoverable error...');
      process.exit(-1);
    }
  });

  socket.on('open', function()
  {
    console.log('connection opened');
    debugger;
    connection_status = 'CONNECTED';
  });

  while(connection_status != 'CONNECTED')
  {
    setTimeout(100);
    continue;
  }
  return socket;
}

try_connection('ws://127.0.0.1:1337');
console.log('hello world');

1 个答案:

答案 0 :(得分:1)

这可以通过异步“递归”函数来完成:

function tryConnecting(callback) {
  var cxn = connect(addr);
  cxn.on('error', function(error) {
    setTimeout(tryConnecting.bind(this, callback), 1000);
  });
  cxn.on('connect', function() {
    callback(cxn);
  });
}

tryConnecting以一秒为间隔(使用setTimeout)重复调用自身,直到connect()调用导致connect事件触发。如果执行此操作,setTimeout函数将以tryConnecting作为参数运行,而不是排队另一个callback调用。

连接完成后您要执行的任何操作都应该放在您传递到cxn的{​​{1}}函数内。