У меня есть массив объектов.Для каждого объекта мне нужно вызвать асинхронный запрос (HTTP-вызов).Но я хочу, чтобы одновременно выполнялся только определенный максимум запросов.Кроме того, было бы хорошо (но не обязательно), если бы я мог иметь одну единственную точку синхронизации после того, как все запросы закончили выполнять некоторый код.
Я попробовал предложения от:
Ограничить количество запросов одновременно с помощью RxJS
Как ограничить параллелизм flatMap?
Запустить асинхронный запрос параллельно, но получить результат взаказ с использованием rxjs
и многих других ... Я даже пытался создавать свои собственные операторы.
Либо ответы на этих страницах слишком стары, чтобы работать с моим кодом, либо я могу 'Я не могу понять, как собрать все воедино, чтобы все типы прекрасно подходили друг другу.
Это то, что у меня есть:
for (const obj of objects) {
this.myService.updateObject(obj).subscribe(value => {
this.anotherService.set(obj);
});
}
РЕДАКТИРОВАТЬ 1: Хорошо, я думаюмы добираемся туда!С ответами Юлиус и pschild (оба, кажется, работают одинаково) мне удалось ограничить количество запросов.Но теперь он будет запускать только первую партию из 4, а остальные - никогда.Итак, теперь у меня есть:
const concurrentRequests = 4;
from(objects)
.pipe(
mergeMap(obj => this.myService.updateObject(obj), concurrentRequests),
tap(result => this.anotherService.set(result))
).subscribe();
Я что-то не так делаю с subscribe()
?
Кстати: параметр mergeMap
с resultSelector
устарел, поэтому я использовал mergeMap
без этого.Кроме того, obj
из mergeMap
не отображается в tap
, поэтому мне пришлось использовать параметр tap
EDIT 2:
Убедитесь, что ваши наблюдатели завершили!(Это стоило мне целый день)