繁体   English   中英

异步socket.io javascript回调无法正常工作

[英]Asynchronous socket.io javascript callback not working

我需要帮助使我的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”

将异步函数调用视为注册处理程序的注册过程,以便在从服务器推送数据时接收数据。

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次。

要注册处理程序,只需将回调函数传入每个:

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}

订单可能无法保证; 但是,因为你正在处理网络。 但希望这有助于您了解其工作原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM