【发布时间】:2020-06-19 19:10:27
【问题描述】:
试图找出一个可靠的方法来确认所有套接字方法成功完成。
在这种情况下,我试图添加一组房间 (socket.join(roomname));到一个套接字,然后确认它们都已被添加,但我似乎无法找到一种方法来触发 console.log(socket.rooms);设置好之后。它总是打印默认房间,并且在我再次从客户端冗余发射后,我才看到其他房间。
我真的想避免使用 setTimeout 或使用 setInterval 进行检查,只是想看看我如何保证套接字与每个房间相连。目前控制台日志只记录整个套接字本身。有人有这方面的经验吗?
io.on("connection", socket => {
console.log("New client connected");
socket.on('fetchConvos', async function(rooms) {
let roomsString;
let result = await mapper(rooms); // makes into array
let joinRooms = new Promise((resolve, reject) => { // Promise to add client to all rooms
for (let i = 0; i < result.length; i++) {
resolve(socket.join(result[i]));
}
throw new Error();
})
// Complete putting user in an array of rooms and then print confirmation that rooms were added
joinRooms.then(() => {
console.log(socket.rooms);
result.forEach((string, index) => {
if (string) {
roomsString += string + ", ";
}
});
socket.emit("chat", "You are now in these rooms: " + roomsString); // emit back to socket
}).catch(error => console.log(error));
})
socket.on("disconnect", () => {
console.log("Client disconnected");
});
});
【问题讨论】:
-
为什么要在 for 循环中解析?想想看。一个 Promise 将从“未决”转变为“已完成”或“被拒绝”一次。再次调用
resolve或reject将产生零效果。 -
socket.join()返回什么?这是一个承诺吗? -
这是正确的,我想我可以在 for 循环中放置一个新的承诺,然后在所有这些都完成后设置一个变量来解析。但是,是的,我不认为 socket.join() 返回一个承诺,它正在返回套接字 obj,它似乎以 Socket { .. 开始。房间键在这里就像房间:{“cTbjCBD4GpI-p0_nAAAA”:“cTbjCBD4GpI-p0_nAAAA " } 但那不是我添加的房间。这是基本功能的默认套接字空间。当我进行另一个发射以获取 convos 时,它会返回它们,但我只是想用一个发射和零 setTimouts 来做所有事情,只是承诺
标签: node.js reactjs express sockets promise