У меня есть массив объектов. Для каждого объекта мне нужно инициировать асинхронный запрос (http-вызов). Но я хочу, чтобы одновременно выполнялось определенное количество запросов. Кроме того, было бы неплохо (но не обязательно), если бы я мог иметь одну единственную точку синхронизации после завершения всех запросов для выполнения некоторого кода.
Я пробовал предложения от:
Ограничение количества запросов за раз с помощью RxJS< /а>
Как ограничить параллелизм flatMap?
Выполнить асинхронный запрос параллельно, но получить результат чтобы использовать rxjs
и многое другое... Я даже пробовал делать свои собственные операторы.
Либо ответы на этих страницах слишком устарели для работы с моим кодом, либо я не могу понять, как собрать все вместе, чтобы все типы подходили друг другу.
Это то, что у меня есть до сих пор:
for (const obj of objects) {
this.myService.updateObject(obj).subscribe(value => {
this.anotherService.set(obj);
});
}
РЕДАКТИРОВАТЬ 1: Хорошо, я думаю, у нас все получилось! С ответами Julius и 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
.
ИЗМЕНИТЬ 2:
Убедитесь, что ваши наблюдатели завершены! (Это стоило мне целого дня)