[英]How to get the callback from a socket.io emit and then return it to the parent function
我有一个名为listClients的js函数。 它发出一个socket.io发出请求,从使用fs读取文件的node.js服务器中获取客户端列表,然后通过回调将数据发送回客户端。
我需要将回调数据返回到原始函数,以便客户端可以执行该函数并使用其返回的数据,但是由于回调包装在其自己的函数中,因此无法正常工作。 解决此问题的最佳方法是什么?
客户:
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和异步执行问题。 您有一个异步调用,想返回一个同步输出。 这不是正确的事情。 因此,在这种情况下,您应该开始查看承诺
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))
如果他们对这样的等待不感兴趣,并且具有异步/等待JS功能,则可以使用
async function clientCode() {
let clientData = await listClients();
}
如果您还想使其同步,请阅读以下文章
http://www.tivix.com/blog/making-promises-in-a-synchronous-manner
但是,由于JS是异步的(涉及网络调用的操作),因此您应尝试使其保持异步,尝试使其保持同步不是一个好习惯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.