Socket.io不会在新创建的房间中立即在组中发送事件

时间:2019-12-22 22:59:45

标签: node.js express socket.io

向新登录用户发送事件时出现问题。我创建了一个“加入”事件,该事件将用户推送到一个数组,然后向位于一个房间内的所有用户发出新的操作“ 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 个答案:

答案 0 :(得分:1)

您是正确的,进入会议室需要一些时间。但是,setTimeout是一个糟糕的解决方案,因为加入会议室所花费的时间是无法预测的。袜子的人也可能无法加入房间。

好消息是socket.join()是一个异步方法,将回调作为第二个参数。所以像这样使用它:

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

@ l-faros也是正确的,因为您的getAllUsers()方法可能是异步的,因此在那里您将遇到另一个同类问题。

恐怕您可能存在JS知识空白,我建议您通过阅读一些有关JavaScript异步性,回调,promise之类的内容(Google是您的朋友)来弥补。