首页 > 解决方案 > js 异步使用数组 push() shift()

问题描述

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

例如:

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 可能会尝试在这个重组阶段之间进行 push() 吗?还是说在 shift() 完成之前,js 不会对数组做任何数组操作?

标签: javascriptnode.jsasynchronouspushshift

解决方案


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

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

Javascript 是单线程的,所以这不是什么好担心的事情——如果一个时间间隔触发了一个执行任务的函数,那么该函数的同步操作(如操作数组)将在任何其他时间间隔回调可以运行之前运行到最后。

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


推荐阅读