Я храню всех пользователей в массиве, и я хочу отправить этот массив всем клиентам через socket.io. У меня есть этот код
var players = new Array();
io.on('connection',function(socket){
var player = {
id: socket.id,
serverid: 0,
x: randomInt(100,400),
y: randomInt(100,400)
};
players[socket.id] = player;
Вот как я его храню, а затем отправляю клиентам
io.emit('new_player',players);
но все, что я получаю, - это пустой массив, но с одиночной работой.
весь код
var players = new Array();
io.on('connection',function(socket){
var player = {
id: socket.id,
serverid: 0,
x: randomInt(100,400),
y: randomInt(100,400)
};
players[socket.id] = player;
io.emit('new_player',JSON.stringify(players));
socket.on('disconnect',function(){
console.info('dced');
});
});
Я уверен, что массив заполнен данными, попробовал войти в консоль, и данные наверняка есть
Изменила ли что-нибудь сериализация (на стороне сервера), а затем десериализация (на стороне клиента)?
нет, это ничего не изменило, все еще пустой массив. Я пробовал это с .push, и он работает, но это побеждает то, что я хотел, чтобы ключи этого массива назывались socket.id
Затем используйте литерал объекта вместо {}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте словарь вместо Array для того, что вы делаете:
var players = {}; // Dictionnary instead of an array
io.on('connection', function(socket){
var player = {
id: socket.id,
serverid: 0,
x: randomInt(100,400),
y: randomInt(100,400)
};
players[socket.id] = player;
io.emit('new_player', players); // Send the dictionnary
socket.on('disconnect', function(){
console.info('dced');
});
});
Вы уверены, что массив не пуст? Попробуйте использовать
players.push(player)вместоplayers[socket.id] = player(что имело бы смысл, если бы это был литерал объекта).