Javascript 同步处理阵列(在处理阵列时进行更新)

Javascript 同步处理阵列(在处理阵列时进行更新),javascript,arrays,Javascript,Arrays,我有一个数组arr,我需要对它的每个值运行一个函数。但是,当循环进程完成对数组的处理时,数组将被更新 例如,arr有1000个用户名,每秒有10个新用户名 如何在这个不断更新的阵列上运行同步任务 也可能没有更多的用户名添加到数组中,因此它应该有一个完成阶段。即使已经完成,用户名也可以再次进入数组,因此我还需要处理任务的重新启动 我在数组元素(用户名)上运行的函数是异步的,即其中有一个setTimeout。您可以使用队列来获得等待项目和完成项目的列表 发布代码的核心是 while (this.qu

我有一个数组
arr
,我需要对它的每个值运行一个函数。但是,当循环进程完成对数组的处理时,数组将被更新

例如,
arr
有1000个用户名,每秒有10个新用户名

如何在这个不断更新的阵列上运行同步任务

也可能没有更多的用户名添加到数组中,因此它应该有一个完成阶段。即使已经完成,用户名也可以再次进入数组,因此我还需要处理任务的重新启动


我在数组元素(用户名)上运行的函数是异步的,即其中有一个
setTimeout

您可以使用队列来获得等待项目和完成项目的列表

发布代码的核心是

while (this.queue.length) {
  this.complete.push(this.mapper(this.queue.pop()))
}
我们正在从队列中提取最新的值,使用mapper函数对其进行修改,并将其添加到完整列表中

类队列{
构造函数(队列、映射器){
this.queue=队列| |[]
this.complete=[]
this.mapper=mapper
//开始运行堆栈处理
this.map()
}
//开始处理堆栈
地图(){
//在堆栈上循环,直到堆栈为空
while(this.queue.length){
this.complete.push(this.mapper(this.queue.pop()))
}
console.log('complete processing',this.complete.length',items')
}
添加(val){
console.log('add',val)
//为堆栈添加值
this.queue.unshift(val)
//运行堆栈处理
this.map()
}
//获取完整的堆栈
已完成(){
把这个还给我。完成
}
}
//只是一个修改堆栈内容的随机函数
常量toHex=项目=>{
常量十六进制=项toString(16)
返回'0x'+(十六进制<10?'0'+十六进制:十六进制)
}
//实例化新堆栈
const queue=新队列([1,2,3,4,5,6,7],toHex)
//这里没什么可看的,只是模拟异步添加
//将项目添加到堆栈中
const startTime=Date.now()
常量计时器=()=>{
const now=Date.now()
添加队列(现在-开始时间)
如果(现在-开始时间<1000){
setTimeout(计时器,parseInt(Math.random()*30))
}
}

timer()
您必须有一个已处理数组和未处理数组,您将处理未处理数组的最后一个元素并将其添加到已处理数组中,然后从未处理数组中删除该元素。您在每个值上运行的函数是更新数组的,还是另一个(无关)进程正在这样做?如果是后者,请详细说明。我们在这里谈论的是什么样的“更新”,您只提到“添加”?即使您正在运行的函数是异步的,这有关系吗?如果在所有项目上同步启动它(以便1000个异步任务同时运行),那么更新有什么问题?@Bergi另一个函数正在执行一个不相关的任务(db任务),但我希望它一次处理1个项目(在我的示例中为用户名)。因为如果有大量数据涌入,数据库就会崩溃。我更喜欢控制队列。所以数组就是这样,一个用于连续任务的队列,而不需要作为任何其他任务的数据结构?你指的是堆栈还是队列?可能是更好的说法。不,这两个数据结构完全不同。你什么意思?我不知道抱歉伙计。从来没有。我认为这是一个
队列
因为它是先进先出的。是的,堆栈应该是后进先出,但您的实现是先进先出的(从开始添加,从结束删除)?