Javascript: получить количество подписчиков BroadcastChannel
Как узнать, существует ли канал широковещания и количество его подписчиков?
У нас есть ссылка на продукт, и некоторые вкладки на хромированной странице подписываются на канал вещания. Хочу посмотреть, сколько слушают.
const bc = new window.BroadcastChannel('channel_name');
Ресурсы:
Связь между вкладками или окнами
Используя среду Angular Typescript, возможно, она имеет библиотечную функцию
1 ответ
Не существует встроенного способа подсчета количества активных портов, подключенных через один и тот же BroadcastChannel.
Вы можете настроить что-то самостоятельно, например, используя какой-либо метод проверки связи, при котором все порты будут отвечать, а запрашивающий просто должен подсчитать ответы за заданное время, но это немного обременительно, делает все асинхронным и фактически использует LocalStorage только для этот подсчет кажется самым простым способом.
Вы можете сохранить в localStorage текущее количество открываемых вами каналов.
Перед каждым новым подключением страница может просто проверять это значение, поскольку оно будет совместно использоваться в контекстах, которые могут взаимодействовать через BroadcastChannel.
const active_connections = localStorage[ channel_name ] || 0;
Затем при подключении ему просто нужно обновить это значение.
if( active_connections < max_count ) {
const channel = new BroadcastChannel( channel_name );
localStorage[ channel_name ] = active_connections + 1;
}
И самое сложное - уменьшить это количество при закрытии канала. Для этого вам нужно будет зацепитьbeforeunload
событие:
addEventListener( 'beforeunload', (evt) => {
localStorage[ channel_name ] --;
} );
Обратите внимание, что если ваш код вызывает channel.close()
, тогда вы должны добавить строку для обновления этого счетчика и отключить его перед выгрузкой.
(Вы все равно можете запустить пинг, чтобы убедиться, что счетчики все еще верны, поскольку, например, если страница вылетает из строя, до выгрузки не могло быть запущено).
Я должен отметить, что не понимаю, зачем вам нужно делать что-то подобное, возможно, что-то не так в вашем дизайне, вам следует дважды проверить это и, возможно, открыть новый вопрос по этому поводу)