我有一个名为 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/