【问题标题】:How to get the callback from a socket.io emit and then return it to the parent function如何从 socket.io 发出回调,然后将其返回给父函数
【发布时间】:2018-07-21 06:01:26
【问题描述】:

我有一个名为 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());
});

【问题讨论】:

  • 在另一边,您也可以像现在为 list_relay_clients 所做的那样通过事件发射传递数据
  • 我确实尝试过,它给了我相同的结果。我需要以某种方式从发出回调中获取数据,然后将其作为原始函数的返回值传递...
  • 你能把工作的sn-p放在这里吗?
  • 不是真的,因为它使用的是 node.js 服务器和 socket.io
  • 但是我想知道你的代码 sn-p 你是怎么试的

标签: javascript node.js sockets


【解决方案1】:

这更像是一个基本的 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 是异步的,一个涉及网络调用的操作,你应该尽量保持它异步,试图让它同步不是一个好习惯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    相关资源
    最近更新 更多