asynchronoussocket.io JavaScriptcallback不工作

我需要帮助,使我的JavaScriptasynchronous,因为我从一个数据库与节点查询。 我正在使用node.js和socket.io。 如果我使用setTimeout()函数,代码将起作用,但是我想使代码更可靠,所以我试图实现callback。 但是,我不知道如何在callback函数中正确使用“socket.on()”。 我认为问题是我嵌套socket.on调用和第二个“socket.on()”调用不会执行。 任何帮助将不胜感激,谢谢。

/*server side*/ socket.emit(variable1);//not important socket.emit(variable2);//not important //code above isn't important, I just wanted to show how data is used from my queries /*client side*/ var socket = io.connect('123.456.789.123:3000'); var data = " ";//data I need to pass around socket1(data, function(){ socket2(data) }); function socket1(data, callback) { socket.on('variable1', function (data) { console.log("1"); callback(); }, callback) } function socket2(data) { console.log("2"); socket.on('variable2', function (data) { console.log("3"); }) } 

输出是“12”,应该是“123”

将函数调用上的asynchronous视为注册处理程序的注册过程,以便从服务器接收数据的时间。

 function registerVariable1(callback) { socket.on('variable1', function (data) { console.log("1"); callback(data); }); } function registerVariable2(callback) { socket.on('variable2', function (data) { console.log("2"); callback(data); }); } 

在服务器上,当您向客户端发送数据时,请使用处理程序的名称作为第一个参数,如此处所述。

 socket.emit('variable1', {data: 1}); socket.emit('variable2', {data: 2}); 

这将把数据发送到正确的处理程序。

就这样说,你可能会想到这个错误。 不要将每个处理程序都视为特定于单个操作。 把这看作是向服务器注册一个监听器,这样服务器就可以继续发送数据到那个处理器。 只需要调用registerVariable1和registerVariable2一次,然后你的服务器就可以将数据返回给每个处理器N次。

要注册处理程序,只需将callback函数传递给每个处理程序:

 registerVariable1(function(data) { console.log('This is the first handler'); console.log(data); // do stuff for this handler here... }); registerVariable2(function(data) { console.log('This is the second handler'); console.log(data); // do stuff for this handler here... }); 

现在,如果服务器进行以下三个调用:

 socket.emit('variable1', {data: 123}); socket.emit('variable2', {data: 24}); socket.emit('variable1', {data: 22}); 

您可能会看到以下输出:

 1 This is the first handler {data: 123} 2 This is the second handler {data: 24} 1 This is the first handler {data: 22} 

订单可能无法保证; 但是,因为你正在处理networking。 但希望这可以帮助你看到这是如何工作的。