Вещательный канал JavaScript ограничен одним полученным сообщением в секунду? - PullRequest
1 голос
/ 28 января 2020

Возможно, я ответил на этот вопрос для себя, но мне нужно проверить работоспособность ...

У меня одна вкладка вещает на другую по широковещательному каналу каждые 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 Ответ

1 голос
/ 28 января 2020

Это другая проблема, чем я думал ...

Оказывается, что вкладки, которые не являются фокусом (по крайней мере, в Chrome), ограничены одним обновлением в секунду. Если я открою отдельную windows и получу одну рассылку для другой, каждое сообщение приходит с любым интервалом, который я выберу (проверено при 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 мс интервал.

В целом, отличные новости, так как я боялся, что у вещательного канала есть некоторые строгие ограничения, о которых я не знал.

Теперь, чтобы определить, как заставить фоновые вкладки обновляться чаще, чем один раз в секунду. ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...