【问题标题】:How to fill a buffer with requests如何用请求填充缓冲区
【发布时间】:2021-12-22 06:00:52
【问题描述】:

我正在寻找如何继续用字符串数组中的块填充请求缓冲区,直到所有块都完成。目前我有这样的事情:

links: string[] // Array to check e.g. 2000 strings
chunkSize = 200;

from(links).pipe(
        bufferCount(chunkSize * 5),
        concatMap(links => {
          const linksToChunk = links;
          const chunks: Observable<string[]>[] = [];
          while (linksToChunk.length > 0) {
            const chunk: string[] = linksToChunk.splice(0, chunkSize);
            chunks.push(this.linkService.checkLinks(chunk));
          }
          return forkJoin(chunks);
        }),
        switchMap(chunks => [...chunks]) //Flatten array
      ).subscribe( 
        // Do stuff 
      )

但是,这样做是发出 5 个请求(块大小的 5 倍),每个请求有 200 个链接,一旦所有 5 个请求都完成后,再发出 5 个,依此类推。它只能完美地工作 5 个,但我宁愿让它不断填充缓冲起来。这是 rxjs v6。

编辑: 已回复here

【问题讨论】:

  • 您可以使用mergeMap 并将您想要发出的最大并发请求作为concurrent 参数传递
  • @NickL 这是一个很好的建议。
  • 随时发布您的解决方案作为答案并接受它

标签: angular typescript rxjs observable buffer


【解决方案1】:

所以正如@NickL 建议使用mergeMap 这就是我最终的结果:

const concurrentRequests = 5;

from(links).pipe(
        bufferCount(chunkSize),
        mergeMap(chunk => this.linkService.checkLinks(chunk), concurrentRequests)
      ).subscribe( 
        // Do stuff 
      )

现在,每次请求完成时,它都会填充由 chunkSize 设置的块,并一直这样做,直到所有链接都从初始链接数组中分块,最多同时请求 5 个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多