Вы можете делать это либо параллельно, либо последовательно, в зависимости от количества запросов и ваших требований.
Параллельные запросы
Используйте Rx JS forkJoin
функция с операторами tap
и catchError
. Попробуйте следующий
import { forkJoin, of, from } from 'rxjs';
import { tap, catchError, concatMap } from 'rxjs/operators';
putDataParallel() {
let success = 0; // <-- trivial counters
let errors = 0;
const reqs = this.urls.map(url => // <-- replate `this.urls` with your object array
this.http.put(url).pipe( // <-- replace `url` with your own PUT request
tap(_ => success++), // <-- count successful responses here
catchError(err => {
errors++; // <-- count errors here
return of(err); // <-- remember to return an observable from `catchError`
})
)
);
forkJoin(reqs).subscribe(
null, // <-- you could change response callback to your requirement
err => console.log(err),
() => console.log(`Success: ${success}\nErrors: ${errors}`),
);
}
Последовательные запросы
Используйте функцию Rx JS from
и оператор concatMap
для последовательного потока данные. Попробуйте следующее:
import { forkJoin, of, from } from 'rxjs';
import { tap, catchError, concatMap } from 'rxjs/operators';
putDataSequential() {
let success = 0; // <-- trivial counters
let errors = 0;
from(this.urls).pipe( // <-- replate `this.urls` with your object array
concatMap(url => {
return this.http.put(url).pipe( // <-- replace `url` with your own PUT request
tap(_ => success++), // <-- count successful responses here
catchError(err => {
errors++; // <-- count errors here
return of(err); // <-- remember to return an observable from `catchError`
})
)
})
).subscribe(
null, // <-- you could change response callback to your requirement
err => console.log(err),
() => console.log(`Success: ${success}\nErrors: ${errors}`),
);
}
Оба метода будут работать до тех пор, пока все объекты в массиве не будут завершены, независимо от ошибок или ответов. Если вы, тем не менее, используете sh, чтобы прервать последовательность в случае ошибки, замените оператор return of(err);
в операторе catchError
, чтобы вместо этого выдавалось уведомление error
или complete
. Например, вы можете использовать Rx JS EMPTY
constant: return EMPTY;
.
Я использовал в качестве примера тривиальные счетчики. Вместо этого вы можете использовать объекты (например) для регистрации количества ответов / ошибок и соответствующего ввода для HTTP-запроса.
Рабочий пример: Stackblitz