我有两个需要访问相同数据的间隔。所以在一个区间中我想将一个元素推送()到一个数组,然后在另一个区间中我想从数组中获取第一个元素然后将其删除。
例如:
let array = [];
let count = 0;
setInterval( () => {
array.push(count);
count++;
}, 1000);
setInterval( () => {
let data = array[0];
array.shift();
console.log("received data: "+data);
}, 1000);
这个输出是:
received data: 0
received data: 1
received data: 2
received data: 3
....
这是否也适用于更复杂的功能和更大的阵列?这会导致任何奇怪的行为吗?也许它可以同时移动和推动并搞乱阵列?这是一个很好的方法吗?还有更好的方法吗?
编辑: 我想这样做的原因。是因为我想从许多不同的链接下载数据。所以在我的脚本中我调用了一个下载(链接)功能,但这会导致脚本同时尝试下载大量链接。所以我想创建一个缓冲区,这样脚本只能同时从100个链接下载。 在脚本内部我想在任何地方调用下载(链接),然后让间隔同时处理仅下载100个链接。因此它从缓冲区中删除100个链接并下载它们。该脚本将新链接推送到同一个数组。
我主要担心的是,当我做一个shift()时,数组会以某种方式重新组织。可能js尝试在这个重组阶段之间进行推送()?或者,在shift()完成之前,js是否会对数组执行任何数组操作?
您将异步推送到数组的链接然后在单独的异步任务中从数组中删除它的一般想法很好,它会起作用。
我主要担心的是,当我做一个shift()时,数组会以某种方式重新组织。可能js尝试在这个重组阶段之间进行推送()?或者,在shift()完成之前,js是否会对数组执行任何数组操作?
Javascript是单线程的,因此不必担心 - 如果一个间隔触发一个执行操作的函数,该函数的同步操作(如操作数组)将在任何其他间隔回调运行之前运行到最后。
共享可变状态的问题对于许多其他语言来说是个问题,但对于Javascript则不是,至少在大多数情况下是这样。