angular - 如何用请求填充缓冲区
问题描述
我正在寻找如何继续用字符串数组中的块填充请求缓冲区,直到所有块都完成。目前我有这样的事情:
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。
编辑:在这里回答
解决方案
所以正如@NickL 建议使用mergeMap这就是我最终得到的:
const concurrentRequests = 5;
from(links).pipe(
bufferCount(chunkSize),
mergeMap(chunk => this.linkService.checkLinks(chunk), concurrentRequests)
).subscribe(
// Do stuff
)
现在,每次请求完成时,它都会填充由 chunkSize 设置的块,并一直这样做,直到所有链接都从初始链接数组中分块,最多同时请求 5 个。
推荐阅读
- excel - 将所有工作表中指定范围的空白单元格替换为 0
- coin-or-cbc - CBC Hangs After Finding Optimal Solution
- java - jar 没有在命令提示符下提供输出,但在 eclipse 中工作正常
- reactjs - 如何使用 Jest 正确模拟 React Navigation 的 getParam 方法
- c# - 实体框架 6:包括嵌套的可空多对多子
- c++ - 唯一指针映射,带有原始指针的 .at()
- javascript - Three.js如何将对象适合屏幕的左半边(宽度和高度)
- java - 构建 RecyclerView 时创建的自动生成文件出错
- python - Django UserSocialAuth 匹配查询不存在
- magento - Magento 1.9 中的促销规则