Я хотел бы знать, как лучше всего использовать библиотеку RxJS для выполнения 3-х http-запросов, что зависит от предыдущего результата.
Давайте представим, что у меня есть 3 сервиса в моем приложении Angular и каждый изу них есть функция get (id: number), используемая для подписки наблюдаемой сущности запроса.
Мне нужно вызвать последовательность первой службы, чтобы получить сущность, которая содержит идентификатор, необходимый для следующего вызова, с использованиемВторой сервис, который также содержит идентификатор, необходимый для следующего вызова с использованием третьего сервиса.
Метод 1: Использование трех подписок и установка каждого результата в глобальные переменные
const firstEntityId = 1;
this.firstService.get(firstEntityId)
.subscribe((firstEntity: FirstEntity) => {
this.firstEntity = firstEntity;
this.secondService.get(firstEntity.secondEntityId)
.subscribe((secondEntity: SecondEntity) => {
this.secondEntity = secondEntity;
this.thirdService.get(secondEntity.thirdEntityId)
.subscribe((thirdEntity: ThirdEntity) => {
this.thirdEntity = thirdEntity;
});
});
});
Метод 2: Использование функции с потоком и одной подпиской для установки всех глобальных переменных
const firstEntityId = 1;
this.getFirstSecondThird(firstEntityId)
.subscribe(([firstEntity, secondEntity, thirdEntity]: [FirstEntity, SecondEntity, ThirdEntity]) => {
this.firstEntity = firstEntity;
this.secondEntity = secondEntity;
this.thirdEntity = thirdEntity;
});
getFirstSecondThird(id: number): Observable<[FirstEntity, SecondEntity, ThirdEntity]> {
return this.firstService.get(id).pipe(
switchMap((firstEntity: FirstEntity) => forkJoin(
of(firstEntity),
this.secondService.get(firstEntity.secondEntityId)
)),
switchMap(([firstEntity, secondEntity]: [FirstEntity, SecondEntity]) => forkJoin(
of(firstEntity),
of(secondEntity),
this.thirdService.get(secondEntity.thirdEntityId)
))
);
}
В этом случае метод с использованием потока является самым быстрым?
Есть ли другой способ написать мойфункция getFirstSecondThird вместо использования методов switchMap и forkJoin?
(я видел комбинатно я не нашел, как передать параметр из предыдущего результата)