向新登录用户发送事件时出现问题。我创建了一个“加入”事件,该事件将用户推送到一个数组,然后向位于一个房间内的所有用户发出新的操作“ 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可以正常工作。但是,如果我删除它-它不起作用。似乎我们需要一些时间才能将此套接字添加到他的房间,然后发送事件。您有什么想法可以改善吗?
答案 0 :(得分:1)
您是正确的,进入会议室需要一些时间。但是,setTimeout
是一个糟糕的解决方案,因为加入会议室所花费的时间是无法预测的。袜子的人也可能无法加入房间。
好消息是socket.join()
是一个异步方法,将回调作为第二个参数。所以像这样使用它:
socket.join('login-room', () => {
io.in('login-room').emit('update-users', getAllUsers());
);
@ l-faros也是正确的,因为您的getAllUsers()
方法可能是异步的,因此在那里您将遇到另一个同类问题。
恐怕您可能存在JS知识空白,我建议您通过阅读一些有关JavaScript异步性,回调,promise之类的内容(Google是您的朋友)来弥补。