javascript - 异步 socket.io javascript 回调不起作用

标签 javascript node.js asynchronous callback socket.io

我需要帮助使我的 javascript 异步,因为我正在使用 Node 从数据库中查询。我正在使用 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/

相关文章:

javascript - 如何用Javascript删除HTML代码?

javascript - 即时创建 HTML5 数据列表

javascript - 检查和修改函数默认参数值

Javascript - 如何避免冗长/丑陋的 if/else 语句?

javascript - 使用nodejs在字符串末尾添加双引号失败

javascript - NodeJS Promise 和 Symbol.species 的使用

node.js - 图像水印,nodejs显示错误

node.js - 如何让一段代码同步工作

java - Spring 3.x - @Async 方法不被任务执行器同时调用

javascript - python (bottle) - 异步响应 - 处理客户端 (javascript)