2 setInterval以不同的间隔修改同一个数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2 setInterval以不同的间隔修改同一个数组相关的知识,希望对你有一定的参考价值。

如果我创建第一个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和间隔是模拟请求的一个例子,我不这样做!最终我将以不同的间隔发出并将每隔30ms广播一次)

答案

这很强大。为什么? javascript是单线程的。每个间隔函数在下一个间隔函数开始之前运行完成。

您可以考虑将其视为队列。您的1ms间隔函数将元素放入队列,而您的1s函数将所有排队的元素一次性从队列中取出。

你用空的替换data数组的技术效果很好。你不会那样得到任何重复。

如果你想从data数组中使用一个项目,你可以使用

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

但这会对阵列的元素进行大量的改组。使用您最喜欢的搜索引擎来查找更高性能的队列实现。

另一答案

代码是安全的。正如O.Jones所说,javascript的单线程特性将确保你不会丢失数组中的任何元素。

但我想补充一点:不要指望,当达到1s间隔时,数据长度为1000(1s = 1000ms)。数据数组的长度总是不同的,通常远低于1000.特别是在压力下(1ms间隔有点压力),javascript无法处理负载时间低于1ms。

看看你的小提琴的this修改版。在我的机器上,这是记录每1秒推送248/253个元素的长度。

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);

以上是关于2 setInterval以不同的间隔修改同一个数组的主要内容,如果未能解决你的问题,请参考以下文章

js的间隔延迟以及dom操作

如何在 setInterval 函数中播放声音?

setTimeout和setInterval的用法

javascript之调度:setTimeout 和 setInterval

避免 setInterval() 在间隔开始时执行

setInterval 和 setTimeout