2 setInterval 以不同的时间间隔修改同一个数组
2 setInterval at different intervals modifying the same array
如果我创建第一个 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 毫秒左右广播一次)
这很稳健。为什么? 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 您的 fiddle 的修改版本。
在我的机器上,这是记录每 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);
如果我创建第一个 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 毫秒左右广播一次)
这很稳健。为什么? 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 您的 fiddle 的修改版本。 在我的机器上,这是记录每 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);