javascript - 如何从 socket.io 发出的回调中获取回调,然后将其返回给父函数

标签 javascript node.js sockets

我有一个名为 listClients 的 js 函数。它使 socket.io 发出请求,从 node.js 服务器获取客户端列表,该服务器使用 fs 读取文件,然后通过回调将数据发送回客户端。

我需要将回调数据返回到原始函数,以便客户端可以执行该函数并使用它返回的数据,但由于回调被包装在它自己的函数中,所以它不起作用。解决这个问题的最佳方法是什么?

客户:

function listClients() {
    var sender = getCookieData('relay_client_id');

    if (sender) {
        socket.emit('list_relay_clients', sender, (callback) => {
            return callback; //This won't work because it's async
        });

        return callback; //<---- I need it to be here
    }
}

服务器:

socket.on('list_relay_clients', function (sender, callback) {
    callback(fetchAllClients());
});

最佳答案

这更多的是一个基本的 JS 和异步执行问题。您有一个异步调用,并且想要返回同步输出。但这不是正确的做法。所以在这种情况下你应该开始考虑 Promise

function listClients() {
    return new Promise( resolve => {
    var sender = getCookieData('relay_client_id');

    if (sender) {
        socket.emit('list_relay_clients', sender, (callback) => {
            resolve(callback)
        });
    }
    });
}

那么该函数的用户应该通过以下方式调用该函数

listClients().then(data=>console.log(data))

如果他们对这样的等待不感兴趣,并且他们有可用的 async/await JS 功能,那么他们可以使用

async function clientCode() {
   let clientData = await listClients();
}

如果您还想使其同步,请阅读下面的文章

http://www.tivix.com/blog/making-promises-in-a-synchronous-manner

但是由于 JS 是异步的,这是一种涉及网络调用的操作,因此您应该尝试使其保持异步,尝试使其成为同步并不是一个好的做法

关于javascript - 如何从 socket.io 发出的回调中获取回调,然后将其返回给父函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48723231/

相关文章:

javascript - 如何循环 promise (nextPageToken)?

c++ - 套接字 : send() function returned 'Broken Pipe' error

php - 使用PHP socket_write发送空格

sockets - peerconnection_client不显示对等体列表

javascript - History.replaceState() 在控制台中给出 404 错误

javascript - 在 Javascript 中将持续时间加在一起

javascript - 仅在 mouseenter 上显示第一个类别的 div

node.js - 如何在 NodeJS 中使用带有 SharpJS 的 Graphql Apollo 处理上传的图像?

node.js - Windows 上的 node-gyp 出现问题 : configure error

python - 如何在node.js中实现这个python代码片段