我需要使我的JavaScript异步的帮助,因为我正在从带有节点的数据库中查询。我正在使用node.js和socket.io。如果我使用setTimeout()函数,则代码可以工作,但是我想使代码更可靠,因此我尝试实现回调。但是,我不知道如何在回调函数中正确使用“ 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”
最佳答案
将异步on函数调用视为用于注册处理程序的注册过程,以便何时从服务器接收数据作为推入。
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}
订单可能无法保证;但是,由于您正在处理网络。但是希望这可以帮助您了解其工作原理。
关于javascript - 异步socket.io JavaScript回调不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25587860/