首页 > 解决方案 > 如何用请求填充缓冲区

问题描述

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

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。

编辑:在这里回答

标签: angulartypescriptrxjsobservablebuffer

解决方案


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

const concurrentRequests = 5;

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

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


推荐阅读