如何在Javascript中等待io.to().emit()完成



我有一个函数需要等待io.to((.emit((调用在客户端完成,然后才能继续。

我尝试过用Promises实现,尝试使用函数await:

await io.to(socketID).emit("request", { var1: val1, var2: val2 })

我认为它不起作用,因为在解析之前仍然没有办法等待io.to((.emit((。不确定这方面的标准做法是什么,因为确认只适用于套接字实例,而不适用于io实例。

const ioEmitFunction = function(id, object) {
return new Promise(resolve => {
io.to(id).emit("request", object);
resolve("Resolved")
})
}
ioEmitFunction(socketID, { var1: val1, var2: val2 }).then((value) => {
//callback here after this stuff is done
})

我还尝试过实现自定义回调。。。这似乎也没有按预期工作,因为当";请求";在客户端完成发射。不知道我在这里应该做什么,任何帮助都非常感谢!

不能使用io.to(...).emit(...),因为它不支持确认。相反,您将不得不单独发送带有确认的消息,并统计确认信息,以便您知道何时收到所有确认信息。你可能还需要实现某种超时,因为如果树莓派暂时关闭或断开连接,你可能会在很长一段时间内得不到确认。

在最新版本的socket.io中,如果你只有一个套接字,你正试图用它来做这件事,你可以得到这样一个套接字:

const sockets = await io.in(socketId).fetchSockets();
if (sockets.length) {
// should only be one socket in the array since we used a single socketId as the room indicator
const piSocket = sockets[0];
piSocket.emit(msg, data, (response) => {
// response has been received
});
}

当然,如果这对控制流有帮助的话,您可以将其封装在promise中。而且,您可能应该添加一个超时。


如果这个应用程序被硬编码为只使用一个Pi套接字,那么你也可以在Pi套接字对象连接的任何时候将其填充到模块级变量中,然后你就可以在该模块的任何地方使用Pi套接字。看来您可能已经在使用socketID执行此操作了。

最新更新