Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在RxJs中实现具有固定堆栈的排队系统_Javascript_Rxjs_Queue_Rxjs6 - Fatal编程技术网

Javascript 在RxJs中实现具有固定堆栈的排队系统

Javascript 在RxJs中实现具有固定堆栈的排队系统,javascript,rxjs,queue,rxjs6,Javascript,Rxjs,Queue,Rxjs6,假设我想要一个队列,其中在任何时间只有3个项目被异步处理,我该怎么做 这就是我的意思:如果我有一个项目集合要上传到后端,即将一些人工制品上传到云存储,然后创建/更新一个文档以反映每个人工制品的url,我不想: 异步/在下一个上载操作之前等待每个上载操作-因为这样会很慢 同时发送所有内容-这可能导致写入热点或速率限制 做一个承诺。比赛-这最终导致2 做一个承诺。所有-如果有一个长时间运行的上传,过程会变慢。 我想做的是: 拥有一个包含所有上传的队列,比如使用RxJs创建方法,例如,从上传项目数组,

假设我想要一个队列,其中在任何时间只有3个项目被异步处理,我该怎么做

这就是我的意思:如果我有一个项目集合要上传到后端,即将一些人工制品上传到云存储,然后创建/更新一个文档以反映每个人工制品的url,我不想:

异步/在下一个上载操作之前等待每个上载操作-因为这样会很慢 同时发送所有内容-这可能导致写入热点或速率限制 做一个承诺。比赛-这最终导致2 做一个承诺。所有-如果有一个长时间运行的上传,过程会变慢。 我想做的是:

拥有一个包含所有上传的队列,比如使用RxJs创建方法,例如,从上传项目数组,一次处理3个项目的堆栈。 当一个项目离开堆栈(即完成)时,我们向队列中添加一个新项目 确保在任何一点上,堆栈中始终有3个项目正在处理,直到队列中没有更多项目等待放入堆栈。 我将如何使用RxJs实现这一点

编辑日期:2020年6月27日

以下是我的想法:

 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作为答案,因为他最初的回答是第一位的,而且是正确的,只是我没有真正理解他当时指的是什么。我将等待你的确认,然后选择他的回答作为答案。谢谢,不用担心,不用担心