我试图创建一个执行以下操作的例程
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');
答案 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}}函数内。