Socket.emit 不会为所有客户端触发
Socket.emit doesn't trigger for all clients
我刚开始使用 socket.io 做出反应,我被困在前端永久检索数据上。我想做的是创建一个小游戏,第一步是创建一个可供多个用户加入的大厅页面。
这是我遇到问题的部分,例如,如果我用用户 Test
创建游戏
大厅现在只有用户测试
选项卡 1:
| --- 测试 --- |
但是如果我打开一个新标签并加入用户 Test1 的当前标签,我的新标签是
选项卡 2:
| --- 测试测试 1 --- |
我遇到的问题是第一个标签只有第一个加入游戏的用户
选项卡 1:
| --- 测试 --- |
此选项卡未触发事件。下一个选项卡等也会发生相同的情况。
Node.js代码
socket.on("getUsers", async (data) => {
if (!data.gameCode) {
universalError("GameCode doesn't exist");
return;
}
const existentGame = await pubClient.get(data.gameCode);
if (!existentGame) {
universalError("The Current Game Does Not Exist");
return;
}
currentGame = JSON.parse(existentGame);
socket.emit("gameUsers", {
gameUsers: currentGame,
});
});
反应代码
const equals = (a, b) => JSON.stringify(a) === JSON.stringify(b);
function() {
const socket = useContext(SocketContext);
const [host, setHost] = useState("");
const [users, setUsers] = useState([]);
useEffect(() => {
if (!currentGameCode) return;
socket.emit("getUsers", { gameCode: currentGameCode });
}, []);
socket.on("gameUsers", (data) => {
setHost(data.gameUsers.host);
console.log(users, data.gameUsers.users);
if (!equals(users, data.gameUsers.users)) {
setUsers(data.gameUsers.users);
}
});
return(
...
)
}
我尝试将 socket.on 放在 useEffect 函数之前,还将 socket.on 插入具有多个依赖项的 useEffect 中,但我没有成功。据我所见,用户在每个选项卡中只输入一次 socket.on("gameUsers"),那是他加入游戏的时候。每次新用户加入游戏时都会调用后端,但是在这种情况下,我的 socket.on 不会触发。对我做错了什么有什么想法吗?期待感谢!
好的,我明白了,问题不在客户端,而是在服务器端。所以我编辑了来自
的标题
Socket.io 不会触发之前选项卡的事件 - React
到
Socket.emit 不会触发所有客户端。
我试图只向触发事件的特定套接字发出事件。
socket.emit < - 仅由 - > socket.on 触发,连接到。
解决方案:使用io.emit发送给所有客户端
io.on("connection", (socket) => { ... });
我刚开始使用 socket.io 做出反应,我被困在前端永久检索数据上。我想做的是创建一个小游戏,第一步是创建一个可供多个用户加入的大厅页面。
这是我遇到问题的部分,例如,如果我用用户 Test
创建游戏大厅现在只有用户测试
选项卡 1:
| --- 测试 --- |
但是如果我打开一个新标签并加入用户 Test1 的当前标签,我的新标签是
选项卡 2:
| --- 测试测试 1 --- |
我遇到的问题是第一个标签只有第一个加入游戏的用户
选项卡 1:
| --- 测试 --- |
此选项卡未触发事件。下一个选项卡等也会发生相同的情况。
Node.js代码
socket.on("getUsers", async (data) => {
if (!data.gameCode) {
universalError("GameCode doesn't exist");
return;
}
const existentGame = await pubClient.get(data.gameCode);
if (!existentGame) {
universalError("The Current Game Does Not Exist");
return;
}
currentGame = JSON.parse(existentGame);
socket.emit("gameUsers", {
gameUsers: currentGame,
});
});
反应代码
const equals = (a, b) => JSON.stringify(a) === JSON.stringify(b);
function() {
const socket = useContext(SocketContext);
const [host, setHost] = useState("");
const [users, setUsers] = useState([]);
useEffect(() => {
if (!currentGameCode) return;
socket.emit("getUsers", { gameCode: currentGameCode });
}, []);
socket.on("gameUsers", (data) => {
setHost(data.gameUsers.host);
console.log(users, data.gameUsers.users);
if (!equals(users, data.gameUsers.users)) {
setUsers(data.gameUsers.users);
}
});
return(
...
)
}
我尝试将 socket.on 放在 useEffect 函数之前,还将 socket.on 插入具有多个依赖项的 useEffect 中,但我没有成功。据我所见,用户在每个选项卡中只输入一次 socket.on("gameUsers"),那是他加入游戏的时候。每次新用户加入游戏时都会调用后端,但是在这种情况下,我的 socket.on 不会触发。对我做错了什么有什么想法吗?期待感谢!
好的,我明白了,问题不在客户端,而是在服务器端。所以我编辑了来自
的标题Socket.io 不会触发之前选项卡的事件 - React
到
Socket.emit 不会触发所有客户端。
我试图只向触发事件的特定套接字发出事件。
socket.emit < - 仅由 - > socket.on 触发,连接到。
解决方案:使用io.emit发送给所有客户端
io.on("connection", (socket) => { ... });