我有一系列訂閱:
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 做到這一點?
uj5u.com熱心網友回復:
如果您有數百萬個零件,您可以提前對陣列進行分塊。
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.log,
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.log,
error: (error: ApiError) => {},
complete: () => {}
});
uj5u.com熱心網友回復:
這可能是您正在尋找的。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/507200.html
