Socket.io не отправляет событие в группе сразу в новую созданную комнату - PullRequest
0 голосов
/ 23 декабря 2019

У меня проблема с отправкой событий новым зарегистрированным пользователям. Я создал событие «join», которое толкает пользователя в массив, а затем отправляет новое действие «update-users» всем пользователям, находящимся в одной комнате.

const { addUser, getAllUsers } = require('./users');

const app = require('express')();
const http = require('http').Server(app);
const io = require('socket.io')(http);

const port = 3000;

const connected = {};
let connectedUsers = [];

io.sockets.on('connection', socket => {
  socket.on('join', ({ name }) => {
    const { error } = addUser({ id: socket.id, name }); // This method is pushing "User" to array. If error is occured, returning error.
    connected[name] = socket.id;

    socket.join('login-room');

    setTimeout(() => {
      io.in('login-room').emit('update-users', getAllUsers());
    }, 400);
  });

});

http.listen(port, () => {
  console.log('connected to port 3000');
});

Итак, как вы видите, яесть setTimeout здесь, с этим setTimeout все работает отлично. Но если я уберу это - это не работает. Похоже, нам нужно некоторое время, чтобы присоединить этот сокет к его комнате, а затем отправить событие. У вас есть идеи, как я могу улучшить это?

1 Ответ

1 голос
/ 23 декабря 2019

Вы правы, что требуется некоторое время, чтобы войти в комнату. Тем не менее, setTimeout - плохое решение, так как время, необходимое для входа в комнату, непредсказуемо. Носик также может не войти в комнату.

Хорошая новость заключается в том, что socket.join() является асинхронным методом и принимает обратный вызов в качестве второго аргумента. Так что используйте это так:

socket.join('login-room', () => {
  io.in('login-room').emit('update-users', getAllUsers());
);

@ l-faros также прав в том, что ваш getAllUsers() метод может быть асинхронным, поэтому у вас там будет другая проблема того же рода.

Боюсь, у вас может быть пробел в знаниях JS, который я советую восполнить, прочитав асинхронность JavaScript, обратные вызовы, обещания и все такое (Google - ваш друг).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...