Ограничен ли широковещательный канал JavaScript одним полученным сообщением в секунду?
Возможно, я сам ответил на этот вопрос, но мне нужно проверить работоспособность...
У меня одна вкладка транслируется на другую по широковещательному каналу каждые 500 мс. Вторая вкладка предназначена для приема трансляций и их печати в журнале консоли.
Вкладка отправки:
const crossTraffic = new BroadcastChannel('crossTraffic');
const queueInterval = setInterval(function(){
crossTraffic.postMessage({action: 'keepalive', cTime: Date.now()});
console.log(`cTime sent ${Date.now()}`);
}
},500);
Вкладка получения:
const crossTraffic = new BroadcastChannel('crossTraffic');
crossTraffic.onmessage = function(e){
if (e.data.action === 'keepalive'){
console.log(`ctime received ${e.data.cTime}`);
}
}
Я заметил следующее: независимо от того, для чего я установил время queueInterval, вкладка приема никогда не будет получать широковещательную рассылку чаще, чем раз в 1000 мс.
Это нормальное поведение для широковещательного канала или возможно получение сообщений с интервалом менее 1000 мс?
1 ответ
Это другая проблема, чем я думал...
Оказывается, вкладки, которые не находятся в фокусе (по крайней мере, в Chrome), ограничены одним обновлением в секунду. Если я открываю отдельные окна и передаю одно сообщение другому, каждое сообщение приходит с любым выбранным мной интервалом (проверено на 100 мс).
Вот модифицированный код, который я использовал для тестирования в окне / вкладке отправки:
const crossTraffic = new BroadcastChannel('crossTraffic');
var queueInterval;
var count = 0;
queueInterval = setInterval(function(){
count++
if (count >= 100){
clearInterval(queueInterval);
}
crossTraffic.postMessage({action: 'keepalive', cTime: Date.now(), count: count});
console.log(`cTime sent ${Date.now()}`);
}
},100);
И доработанный ресивер:
const crossTraffic = new BroadcastChannel('crossTraffic');
crossTraffic.onmessage = function(e){
if (e.data.action === 'keepalive'){
console.log(`ctime received ${e.data.cTime}, #${e.data.count}`);
}
}
Вы заметите, что если и отправитель, и получатель являются вкладками в одном окне, получатель будет регистрировать их только один раз в секунду, но все 100 сообщений будут отправлены и получены.
Затем вытащите одну из вкладок в отдельное окно и поместите их рядом, наблюдая за их журналами: сообщение будет отправляться и получаться с интервалом 100 мс.
В целом, отличная новость, так как я боялся, что у вещательного канала есть некоторые строгие ограничения, о которых я не знал.
Теперь определим, как заставить фоновые вкладки обновляться чаще, чем раз в секунду...