#javascript #node.js #socket.io
#javascript #node.js #socket.io
Вопрос:
Я хочу извлечь все отдельные объекты сокета из io.sockets
и выполнить итерацию по каждому из них.
Что-то вроде:
for (socket in io.sockets.something()) {
// do something with each socket
}
Либо я делаю это неправильно, либо я, должно быть, что-то упускаю. Мысли?
Комментарии:
1. Итак, в чем проблема или вопрос?
2. Мне просто любопытно, каков был бы вариант использования для этого?
Ответ №1:
Официальный метод:
io.sockets.clients().forEach(function (socket) { .. });
Или фильтр по комнатам:
io.sockets.clients('roomname') .. same as above ..
Это рекомендуется по сравнению с предложением, приведенным выше, как сокет.внутренняя структура данных io всегда может быть изменена и потенциально нарушить весь ваш код при будущих обновлениях. Вы гораздо меньше рискуете, когда используете этот official
метод.
Комментарии:
1. Это моя единственная жалоба на то, что в остальном фантастическое Socket.io : несмотря на множество примеров , нет краткой документации по API, что позволяет мне самостоятельно выбирать путь к моему первому предложению.
2. josh3736 да, документация — это немного больное место в банкомате. вероятно, нам следует запустить инструмент JSDoc над нашим кодом, чтобы создать небольшую документацию по API.
3. @3rdEden Я нахожу действительно ироничным, что это было предложено в качестве официального метода и было быстро удалено в Socket. IO 1.0 🙂 — Это должно добавить его обратно…
Ответ №2:
Это может быть или не быть «документировано», но работает:
for (var id in io.sockets.sockets) {
var s = io.sockets.sockets[id];
if (!s.disconnected) {
// ...
// for example, s.emit('event', { ... });
}
}
Использовать io.sockets.clients()
:
io.sockets.clients().forEach(function(s) {
// ...
// for example, s.emit('event', { ... });
});
Вы можете использовать отличный инспектор узлов для подключения к вашему приложению и проверки содержимого s
.
Комментарии:
1. Это именно то, что мне было нужно. Проверка io.sockets сделала это очевидным для меня. Я понимаю, что мой вопрос не был ясен, спасибо за ответ.
Ответ №3:
Получить все сокеты, в которых нет места:
for (let s of io.of('/').sockets) {
let socket = s[1];
socket.emit(...);}