如何用请求填充缓冲区
How to fill a buffer with requests
我正在寻找如何继续用字符串数组中的块填充请求缓冲区,直到完成所有块。目前我有这样的东西:
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 倍),每个请求有 200 个链接,一旦完成所有 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 个。
我正在寻找如何继续用字符串数组中的块填充请求缓冲区,直到完成所有块。目前我有这样的东西:
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 倍),每个请求有 200 个链接,一旦完成所有 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 个。