js使用数组push()shift()异步

时间:2019-03-14 08:38:49

标签: javascript node.js asynchronous push shift

我有两个需要访问相同数据的时间间隔。 因此,在一个间隔中,我想将一个元素推()到数组中,然后在另一个间隔中,我想从数组中获取第一个元素,然后将其删除。

例如:

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
....

这还可以用于更复杂的功能和更大的数组吗? 这会导致任何奇怪的行为吗?也许它可以同时移动和推动并弄乱阵列? 这是个好方法吗?有更好的方法吗?

编辑:
我想这样做的原因。是因为我想从许多不同的链接下载数据。因此,在脚本中我调用了download(link)函数,但这将导致脚本尝试同时下载许多链接。因此,我想创建一个缓冲区,以便脚本只能同时从100个链接下载。
在脚本中,我想在任意位置调用download(link),然后让一个间隔负责一次仅下载100个链接。因此,它会从缓冲区中删除100个链接并下载它们。当脚本将新链接推送到同一数组时。

我主要担心的是,当我执行shift()时,数组将以某种方式进行自身重组。 js可能在此重组阶段之间尝试制作push()吗?还是在shift()完成之前js对数组不做任何数组操作?

1 个答案:

答案 0 :(得分:2)

您一般的想法是异步推送到数组的链接,然后在单独的异步任务中将其从数组中删除,这会起作用。

  

我主要担心的是,当我执行shift()时,数组将以某种方式进行自身重组。 js可能在此重组阶段之间尝试制作push()吗?还是在shift()完成之前js对数组不做任何数组操作?

Javascript是单线程的,因此不必担心-如果一个时间间隔触发一个执行填充的函数,则该函数的同步操作(如操作数组)将一直运行到结束 >,然后再运行其他间隔回调。

至少在大多数情况下,共享可变状态的问题对于许多其他语言是一个问题,但对于Javascript而言不是。