2 setInterval с разными интервалами, модифицируя один и тот же массив - PullRequest
0 голосов
/ 21 марта 2019

Если я создаю первый setInterval, который передает каждую 1 миллисекунду элемент в моем массиве, а затем у меня есть еще один setInterval (каждую секунду), который копирует этот массив и сбрасывает его (исходный).

Буду ли я уверен, что не стираю данные?так как первый интервал записывает каждую 1 миллисекунду, а второй интервал сбрасывает массив каждую секунду?

Вот jsfiddle http://jsfiddle.net/t1d20usr/

var data = [];

var i = 0;
var interval = setInterval(function() {

  data.push(i);
  i++;

  if(i== 10000) {
    clearInterval(interval);
  }

}, 1);

setInterval(function() {

  var recentData = data;
  //i want to be sure that this will not erase something set between the set of recentData and the reset of this array 
  data = [];   

  $('.container').append(recentData.join(',')');

}, 1000);

Работает отлично, но из-залогика, интересно, иногда я могу потерять данные.

Почему я это делаю?Потому что я получаю много запросов от разных клиентов (генерирует сокеты), и я хочу передавать их другим клиентам только один раз в секунду вместо широковещательной рассылки по каждому излучению от каждого излишнего клиента.Это похоже на работу многопользовательских игровых серверов.(Мой jsfiddle и интервалы - это пример для имитации запросов, я не делаю это так! В конце концов я получу испускания через разные интервалы и буду транслировать их каждые 30 мс или около того)

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Код безопасен. Как сказал О. Джонс, однопотоковая природа javascript гарантирует, что вы не потеряете ни один элемент в массиве.

Но я хотел бы добавить соображение: не ожидайте, что при достижении интервала 1 с длина данных будет 1000 (1 с = 1000 мс). Длина массива данных всегда будет разной и часто намного меньше 1000. Особенно в условиях стресса (интервал 1 мс немного напрягает), javascript не может справиться с нагрузкой, занимая время меньше 1 мс.

Посмотрите на эту модифицированную версию вашей скрипки. На моей машине это длина записи в диапазоне 248/253 элементов, нажимаемых каждые 1 с.

var data = [];

var i = 0;
var interval = setInterval(function() {

  data.push(i);
  i++;

  if(i== 10000) {
    clearInterval(interval);
  }

}, 1);

setInterval(function() {
  console.log(data.length)
  var recentData = data;
  data = [];

  $('.container').append(recentData.join(',') + '<span class="iteration">/</span>');

}, 1000);
0 голосов
/ 21 марта 2019

Это надежно. Зачем? Javascript является однопоточным. Каждая интервальная функция выполняется до завершения следующей.

Вы можете подумать об этом как об очереди. Ваша функция интервала 1 мс помещает элементы в очередь, а ваша функция 1s убирает все элементы из очереди за один раз.

Ваша техника замены массива data на пустой работает хорошо. Вы не получите дубликаты таким образом.

Если вы хотите использовать один элемент из массива data, вы можете использовать

   const item = data.length > 0 ? data.shift() : null

но это сильно перемешивает элементы массива. Используйте вашу любимую поисковую систему, чтобы найти более эффективные реализации очереди.

...