我知道nodejs本质上是异步的,并且最好使用这种方式,但我有一个用例,我们需要以同步的方式处理传入的TCP连接。收到新连接后,我们需要连接到其他TCP服务器并执行一些簿记等工作,然后处理其他连接。由于连接数量有限,因此可以同步处理。
寻找一种优雅的方式来处理这种情况。
net.createServer(function(sock) {
console.log('Received a connection - ');
var sock = null;
var testvar = null;
sock = new net.Socket();
sock.connect(PORT, HOST, function() {
console.log('Connected to server - ');
});
//Other listeners
}
在上面的代码中,如果同时接收到两个连接,则输出可能是(因为异步性质):
Received a connection
Receive a connection
Connected to server
Connected to server
但期望是:
Received a connection
Connected to server
Receive a connection
Connected to server
这是什么方法?
一种解决方案是实现一种排队类型的解决方案,并且已经完成了排放'或者'完成'处理下一次连接的事件。
为此,我们可能必须从createServer调用中取出连接回调。在这种情况下如何处理连接和其他变量(testvar)的范围?
在这种情况下,如果在队列中但尚未处理但尚未处理的数据连接上收到数据/消息,会发生什么?'听众已注册。?
任何其他更好的解决方案都会有所帮助。
答案 0 :(得分:4)
我认为将synchronous
代码与serial
代码的概念分开是很重要的。您希望以串行方式处理每个请求,但在异步处理每个请求时仍可以完成。对于您的情况,最简单的方法可能是拥有一个处理请求队列。
var inProgress = false;
var queue = [];
net.createServer(function(sock){
queue.push(sock);
processQueue();
});
function processQueue(){
if (inProgress || queue.length === 0) return;
inProgress = true;
handleSockSerial(queue.shift(), function(){
inProgress = false;
processQueue();
});
}
function handleSockSerial(sock, callback){
// Do all your stuff and then call 'callback' when you are done.
}
注意,只要您使用节点>= 0.10
,来自套接字的数据将被缓冲,直到您读取数据。