我有一个Angular 2应用程序,它从服务器获取不同数量的ID,然后,对于每个id,在forkJoin
中进行另一个REST调用。
但是,id的数量可能会达到几百个,这可能会在突然进行数百个REST并行调用时出现问题。
使用RxJ和forkJoin
运算符时,有没有办法限制并行调用次数?
答案 0 :(得分:3)
Onw方式是使用bufferCount
:
Rx.Observable.from([1,2,3,4,5,6,7,8])
.bufferCount(3)
.concatMap(items => {
console.log('ConcatMap', items);
let tasks = items.map(item => Rx.Observable.timer(Math.random() * 1000).do(() => console.log(item, 'ready')));
return Rx.Observable.forkJoin(...tasks);
})
.subscribe()

<script src="https://npmcdn.com/@reactivex/rxjs@5.3.1/dist/global/Rx.js"></script>
&#13;
答案 1 :(得分:0)
我已经完成了一项功能,希望对您有所帮助! (使用RxJS 6和lodash)
const { timer, forkJoin, of } = rxjs;
const { tap, map, mapTo, first, switchMapTo, concatMap } = rxjs.operators;
forkJoinLimit = (limit, sources) => {
if (sources.length < limit) {
return forkJoin(sources);
}
return _.reduce(
_.chunk(sources, limit),
(acc, subSource) => {
acc = acc.pipe(
concatMap(val =>
forkJoin(subSource).pipe(
map(val2 => (val)? _.concat(val, val2): val2),
)));
return acc;
}, of(null));
};
generateObservable = val =>
of(null).pipe(
tap(() => console.log("Starting " + val)),
switchMapTo(
timer(Math.floor(Math.random() * 1000) + 1).pipe(
first(),
mapTo(val),
tap(() => console.log("Ending " + val))),
));
console.clear();
const serie = [];
const size = 10;
const limit = 3;
for (let i = 0; i < 10; i++) {
serie.push(generateObservable(i));
}
forkJoinLimit(limit, serie).subscribe(x => console.log("-- End --", x));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.0/rxjs.umd.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>