我有一个数组arr
,我需要在每个值上运行一个函数。但是,在循环过程完成处理数组之前,数组会更新。
例如,arr
有1000个用户名,每秒有10个新用户名。
如何在这个不断更新的阵列上运行同步任务?
也有可能没有更多的用户名被添加到数组中,所以它应该有一个完成阶段。然后,即使已经完成,用户名也可以再次开始进入数组,因此我还需要处理任务的重新启动。
我在数组元素(用户名)上运行的函数是异步的,IE中有一个setTimeout
。
答案 0 :(得分:0)
您可以使用队列来获取等待项目和完整项目的列表。
已发布代码的内容是
while (this.queue.length) {
this.complete.push(this.mapper(this.queue.pop()))
}
我们从队列中提取最新值,使用mapper函数修改它并将其添加到完整列表中。
class Queue {
constructor(queue, mapper) {
this.queue = queue || []
this.complete = []
this.mapper = mapper
// start running the stack processing
this.map()
}
// start processing the stack
map() {
// loop over the stack until it's empty
while (this.queue.length) {
this.complete.push(this.mapper(this.queue.pop()))
}
console.log('complete processing', this.complete.length, 'items')
}
add(val) {
console.log('add', val)
// add value to the stack
this.queue.unshift(val)
// run the stack processing
this.map()
}
// get the complete stack
completed() {
return this.complete
}
}
// just a random function to modify the stack contents
const toHex = item => {
const hex = item.toString(16)
return '0x' + (hex < 10 ? '0' + hex : hex)
}
// instantiate your new stack
const queue = new Queue([1, 2, 3, 4, 5, 6, 7], toHex)
// nothing to see here, it's just to mock up the asynchronous adding
// of items to the stack
const startTime = Date.now()
const timer = () => {
const now = Date.now()
queue.add(now - startTime)
if (now - startTime < 1000) {
setTimeout(timer, parseInt(Math.random() * 30))
}
}
timer()