如何等到 io.to().emit() 在 Javascript 中完成
How to wait until io.to().emit() is finished in Javascript
我有一个函数需要等待 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(...)
,因为它不支持确认。相反,您将必须单独发送带有确认的消息并计算确认数,以便您知道何时收到了所有消息。您可能还需要实施某种超时,因为如果 raspberry Pi 暂时关闭或断开连接,您可能会在非常非常长的时间内得不到确认。
在最新版本的 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 这样做了。
我有一个函数需要等待 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(...)
,因为它不支持确认。相反,您将必须单独发送带有确认的消息并计算确认数,以便您知道何时收到了所有消息。您可能还需要实施某种超时,因为如果 raspberry Pi 暂时关闭或断开连接,您可能会在非常非常长的时间内得不到确认。
在最新版本的 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 这样做了。