2014-08-31 132 views
1

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

/*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”

回答

2

想起函数异步的调用作为对注册处理时数据被接收作为来自服务器的推动的登记处理。

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); 
    }); 
} 

在服务器上,当你发出数据到客户端,将处理程序作为第一个参数的名称,描述here

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

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

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

要注册的处理程序,您只需传递一个回调函数到每个:

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} 

可能无法保证排列顺序。然而,因为你正在处理网络。但希望这可以帮助你看到这是如何工作的。

+0

嘿,感谢您的深入解释!我的服务器代码只能发出一次,因为它在从数据库中进行查询之后就这样做了。我按照指定的方式实现了我的代码,并且输出正在打印,但方法以错误的顺序打印出来(2,1)。有没有办法确保registerVariable1()在调用registerVariable2()之前执行并完全结束?这就是我想要实现的,也许服务器端是问题,但我不能多次查询,因此每个处理程序只能有一组数据发射。希望这是有道理的。再次感谢! – 2014-08-31 01:47:07

+0

这听起来像你的问题不是服务器端,它是客户端。这听起来像是当你发布数据库时你有所有数据,所以你可以在JSON对象中发射它,然后分别处理这些数据,不是吗? – jmort253 2014-08-31 01:48:41

+0

换句话说,'socket.emit({varOne:dataForVar1Here,varTwo:dataForVar2Here});'一次发送所有数据,就是我所说的...... – jmort253 2014-08-31 01:49:26