У меня есть массив подписок:
const partsArray = parts.map(item => this.partsService.deletePart(item.id));
Затем я вызываю forkJoin для подписок и удаляю их все сразу:
forkJoin(partsArray).subscribe({
error: (error: ApiError) => {
},
complete: () => {
}
});
Проблема в том, что это может быть 10 или 100, поэтому мне нужно их группировать и делать задержку каждые 10.
10 API CALLS
Delay of 500ms
10 API calls
Delay of 500ms
Как я могу сделать это с помощью rxjs?
Да, это ответ.





это может быть то, что вы ищете.
const partsArray = parts.map(item => this.partsService.deletePart(item.id).pipe(delay(500)));
forkJoin(partsArray).subscribe(...)
проверьте эту документацию о RxJs: https://www.learnrxjs.io/learn-rxjs/operators/utility/delay
ТАК задерживает каждый запрос, и я хочу отложить после каждого 10-го
взгляните на другие ответы, в которых используется bufferCount + Delay. Прочитайте документы для лучшего понимания
Если у вас есть миллионы частей, вы можете заранее разбить массив на части.
function chunk(arr, chunkSize) {
if (chunkSize <= 0) throw "Invalid chunk size";
let v = [];
for (let i=0,len=arr.length; i<len; i+=chunkSize) {
v.push(arr.slice(i,i+chunkSize));
}
return v;
}
const delayObs = timer(500).pipe(ignoreElements());
// An array of observables
const partsArray = parts.map(item => this.partsService.deletePart(item.id));
const partsChunked = chunk(partsArray, 10);
const apiResultsChunked = from(partsChunked).pipe(
concatMap(parts => concat(forkJoin(parts), delayObs))
);
apiResultsChunked.subscribe({
next: console.info,
error: (error: ApiError) => {
},
complete: () => {
}
});
Вы можете немного упростить это, если будете использовать буфер RxJS вместо предварительного разделения массива.
from(
parts.map(item => this.partsService.deletePart(item.id))
).pipe(
bufferCount(10),
concatMap(parts => concat(
forkJoin(parts),
timer(500).pipe(ignoreElements())
))
).subscribe({
next: console.info,
error: (error: ApiError) => {},
complete: () => {}
});
Именно так
from(parts).pipe(
map(({ id }) => this.partsService.deletePart(id)),
bufferCount(10),
concatMap((apis) => forkJoin(apis).pipe(delay(500)))
).subscribe(...);
Проверьте этот ответ