Javascript 在RxJs中实现具有固定堆栈的排队系统
假设我想要一个队列,其中在任何时间只有3个项目被异步处理,我该怎么做 这就是我的意思:如果我有一个项目集合要上传到后端,即将一些人工制品上传到云存储,然后创建/更新一个文档以反映每个人工制品的url,我不想: 异步/在下一个上载操作之前等待每个上载操作-因为这样会很慢 同时发送所有内容-这可能导致写入热点或速率限制 做一个承诺。比赛-这最终导致2 做一个承诺。所有-如果有一个长时间运行的上传,过程会变慢。 我想做的是: 拥有一个包含所有上传的队列,比如使用RxJs创建方法,例如,从上传项目数组,一次处理3个项目的堆栈。 当一个项目离开堆栈(即完成)时,我们向队列中添加一个新项目 确保在任何一点上,堆栈中始终有3个项目正在处理,直到队列中没有更多项目等待放入堆栈。 我将如何使用RxJs实现这一点 编辑日期:2020年6月27日 以下是我的想法:Javascript 在RxJs中实现具有固定堆栈的排队系统,javascript,rxjs,queue,rxjs6,Javascript,Rxjs,Queue,Rxjs6,假设我想要一个队列,其中在任何时间只有3个项目被异步处理,我该怎么做 这就是我的意思:如果我有一个项目集合要上传到后端,即将一些人工制品上传到云存储,然后创建/更新一个文档以反映每个人工制品的url,我不想: 异步/在下一个上载操作之前等待每个上载操作-因为这样会很慢 同时发送所有内容-这可能导致写入热点或速率限制 做一个承诺。比赛-这最终导致2 做一个承诺。所有-如果有一个长时间运行的上传,过程会变慢。 我想做的是: 拥有一个包含所有上传的队列,比如使用RxJs创建方法,例如,从上传项目数组,
const rxQueue = from(filesArray) // this is the list of files to upload say like 25 files or so
rxQueue
.pipe(
mergeMap((item) =>
of(item).pipe(
tap(async (item) => {
await Promise.race([
processUpload(item[0]),
processUpload(item[1]),
processUpload(item[2]),
])
}),
),
3
),
)
.subscribe()
我们的目标是确保在任何时候,3个文件都会被处理并上传很多,这样,如果一个文件上传过程结束,就会添加另一个文件以保持堆栈在3个上传过程中。同样,如果两个文件上载同时结束,则会向堆栈中添加两个新文件,依此类推,直到上载文件数组中的所有文件。使用Subject作为队列,使用mergeMap有一个并发参数,可以限制最大并发数
const queue=new Subject()
queque.asObservable().pipe(mergeMap(item=>httpCall(item),3)
queue.next(item)
使用Subject作为队列,使用mergeMap有一个并发参数,可以限制最大并发数
const queue=new Subject()
queque.asObservable().pipe(mergeMap(item=>httpCall(item),3)
queue.next(item)
我想你可以试试这个: 从文件数组 管 mergeMapfile=>service.uploadFilefile,3 这假设service.uploadFile返回一个承诺或一个可观察的
假设您有5个文件,那么将从前3个文件创建3个观察对象,当其中一个文件完成时,将获取第4个文件并从中创建一个新的观察对象,依此类推。我认为您可以尝试以下方法: 从文件数组 管 mergeMapfile=>service.uploadFilefile,3 这假设service.uploadFile返回一个承诺或一个可观察的
假设您有5个文件,那么将从前3个文件创建3个观察值,当其中一个文件完成时,将获取第4个文件并从中创建一个新的观察值,依此类推。您考虑过mergeMap的第三个参数吗?mergeMap=>obs$,空,3谢谢您的迅速回复。请参阅问题中的编辑/更新以了解更多上下文。您是否考虑过mergeMap的第三个参数?mergeMap=>obs$,空,3谢谢您的迅速回复。请参阅问题中的编辑/更新以了解更多内容。谢谢@Fanchung。我感谢您的快速回复。请参阅问题中的编辑/更新以了解更多内容。非常感谢您的回答,它完全按照我的需要解决了问题。请允许我选择@AndreiGătej response作为答案,因为他最初的回答是第一位的,而且是正确的,只是我没有真正理解他当时指的是什么。我将等待你的确认,然后选择他的回答作为答案。非常感谢,不用担心,不用担心,谢谢@fanchung,我感谢你的迅速回复。请参阅问题中的编辑/更新以了解更多内容。非常感谢您的回答,它完全按照我的需要解决了问题。请允许我选择@AndreiGătej response作为答案,因为他最初的回答是第一位的,而且是正确的,只是我没有真正理解他当时指的是什么。我将等待你的确认,然后选择他的回答作为答案。谢谢,不用担心,不用担心