我正在为一个web应用程序进行缓存失效处理。期望的行为是,当有人访问配置文件页面时,将触发对该用户数据的重述。我只想一次最多运行k个更新作业。
我提出了以下javascript来创建异步迭代器,在等待输入时可以阻止该迭代器:
const pipeline = {
queue: [],
resolve: null,
hold: null,
[Symbol.asyncIterator]() {
return {
async next() {
while(pipeline.queue.length === 0) {
if(pipeline.hold === null) {
pipeline.hold = new Promise(resolve => {
pipeline.resolve = resolve
})
}
await pipeline.hold
pipeline.hold = null
}
return Promise.resolve({
done: false, value: pipeline.queue.shift()
})
}
}
},
enqueue(id) {
this.queue.push(id)
const resolve = this.resolve
this.resolve = null
resolve?.()
},
}
我用来处理队列的代码是按照异步批处理建模的:
const next = async () => {
await Promise.all(
Array(5).fill(null).map(async (_, idx) => {
for await (let id of pipeline) {
await handler(id, idx)
}
})
)
}
如果我从包含超过k个元素的队列开始,那么所有插槽都将用于处理。如果我从一个或两个元素开始,它只使用前两个插槽。
有人看到我逻辑上的缺陷吗?
暂无答案!
目前还没有任何答案,快来回答吧!