Я недавно оказался в такой же ситуации. API, который я потреблял, мог принимать только 4 запроса в секунду.
Это то, что я придумал.
Труба rateLimit
import { asyncScheduler, BehaviorSubject, timer, MonoTypeOperatorFunction, Observable } from 'rxjs'
import { filter, map, mergeMap, take } from 'rxjs/operators'
export function rateLimit<T>(
count: number,
slidingWindowTime: number,
scheduler = asyncScheduler,
): MonoTypeOperatorFunction<T> {
let tokens = count
const tokenChanged = new BehaviorSubject(tokens)
const consumeToken = () => tokenChanged.next(--tokens)
const renewToken = () => tokenChanged.next(++tokens)
const availableTokens = tokenChanged.pipe(filter(() => tokens > 0))
return mergeMap<T, Observable<T>>((value: T) =>
availableTokens.pipe(
take(1),
map(() => {
consumeToken()
timer(slidingWindowTime, scheduler).subscribe(renewToken)
return value
}),
),
)
}
И вы можете использовать его нравится. Я хочу получить все контракты в contractIds $ от API. Я только хочу отправлять 4 запроса каждые 1000 мс
const contracts$ = contractIds$.pipe(
rateLimit(4, 1000),
mergeMap(contract => this.get(contract.DocumentNumber)),
)
Может быть, это поможет вам:)