У меня есть такой код:
if (players[j].socket){
players[j].socket.emit("bla");
players[j].socket.emit("bla");
}
второй испускает аварийный сервер, потому что:
TypeError: Cannot read property 'emit' of null
Но как это возможно, что второй испускает аварийный сервер? В первом сокете emit не ноль, а во втором -? Я думаю, что для второго эмитента player [j] имеет другое значение, потому что массив player был изменен.
Но как вы можете видеть в моем коде, я ничего не делаю с массивом игроков. Возможно ли, что какой-то другой асинхронный код изменил массив игроков? Не должно быть синхронного javascript?
Возможно ли в моем коде, что игроки [j] в моей первой строке отличаются от второй строки?
Обновлено: у некоторых игроков свойство socket null, потому что они боты.
Edit2: также эта проблема началась после того, как я внедрил ботов.
Вы закрывали сокет в какой-либо части вашего кода?
Просто добавьте точку останова для отладки. console.info(j, players[j].socket); players[j].socket.emit("bla"); console.info(j, players[j].socket); players[j].socket.emit("bla");
Я столкнулся с подобными вещами ... Имейте в виду, что Javascript не копирует объекты глубоко ...;) Это может означать, что когда вы добавляете соединения в массив, вы фактически не захватываете все это . Я переключился на запрос класса веб-сокета для текущих подключений и добавляю к ним _id, когда они запускаются, чтобы я мог отличить одно от другого.
Ошибки такого типа действительно легко отлаживать и тестировать, пожалуйста, запишите в консоль свой j, player [j], и player перед этой строкой, и вы увидите все, а оттуда увидите, какая из них «очищается». Затем переверните код и найдите его
Player [j] .socket имеет значение NULL во второй строке, вероятно, потому, что его бот по умолчанию имеет нулевое значение
Моше Шмуклер: вы имеете в виду, что player [j] .socket имеет значение null?
Я уже изменил свой код на сервере (я chache player [j]). мой вопрос: возможно ли, что player [j] .socket в первой строке отличается от второй строки. потому что, если я прав, это невозможно
Если у вас есть боты и игроки, почему бы не кэшировать их в двух разных местах. Я предполагаю, что с добавлением или удалением бота / игрока происходит что-то странное. Кстати, я бы порекомендовал вам использовать socketRooms вместо того, чтобы сохранять их в массивах. Вы сможете излучать всю группу и иметь возможность горизонтального масштабирования в будущем.



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


Как / где вы сконструируете свой
players? Очевидно, что к моменту выполнения второй строкиplayers[j]будет нулевым.