@kaliboba

Есть ли тут ошибка в логике?

Имеется код на стороне сервера:
let players = [];
let count = 1;
io.on("connection", (socket) =>
{
 socket.on("server", () => {
    players.push(
            {
            id: socket.id,
            count: count,
            });
        count++;
        socket.emit("state", players);
    });
 socket.on("disconnect", () => {
    players.pop();
    socket.emit("state", players);
    count--;
    });
});

и на стороне клиента:
const socket = io();

socket.on("state", (data) => 
{   
    for(let i = 0; i < data.length; i++){
        const hello = document.createElement("div");
        console.log(`ID игрока ${data[i].id} номер игрока: ${data[i].count}`);
        // hello.innerText = `ID игрока ${data[i].id} номер игрока: ${data[i].count}`;
        // document.body.appendChild(hello);
    };
});

Что понял, пока изучал проблему: список игроков получает, запрос "server" отправляется, но почему-то не отправляется запрос "state", в чём причина?
Также нашёл ошибку:
Error: operation has timed out
    at Timeout._onTimeout

обнаружил, что state всё-таки приходит, но до цикла дело не доходит, данные - undefined
p.s
подключал client.js в body, в самом конце
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
Daemon23RUS
@Daemon23RUS
Есть, и несколько. Неизвестно как у Вас задумано, придумаю за вас.
Все кто подключаются - игроки.
Одно подключение - один игрок. (3 вкладки браузера - 3 игрока)
Про ошибки:
в секции io.on("connection") у вас всего 2 события "server" и "disconnect" причем 2е вызывается уже после того как клиент отключился (что в принципе правильно) поэтому посылать ему сообщения - уже некуда.
На каждый запрос от клиента socket.on("server" Вы увеличиваете счетчик игроков. А список идентификаторов вы отправляете только тому, кто прислал этот запрос. Не всем
В 2х словах как может быть: одна переменная count=0 при событии on("connection") увеличивается а при "disconnect" уменьшается.
объект players={} подумайте как организовать, чтобы было ключ-значение где ключ socket.id при disconnect удаляете значение с этим ключем socket.id отключившегося.
ну и при "connection" и "disconnect" отправляете всем io.sockets.emit("state", players);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы