Создайте тему воспроизведения:
const sub = new ReplaySubject(3);
Затем сделайте ваши звонки
this.getProject(1).pipe(
tap(project => sub.next(project)),
switchMap(project => this.getSites(1)),
tap(sites => sub.next(sites)),
switchMap(sites => this.getPersons(sites[0].id)),
tap(person => sub.next(person))
);
Ваша тема воспроизведения будет содержать проект в качестве первого значения, сайты в качестве второго значения, человек в качестветретье значение.
Вы можете сделать это в формате combineLatest
с BehaviorSubject
.
const obs = new BehaviorSubject([]);
const add = val => obs.pipe(
take(1),
map(v => ([...v, val]))
).subscribe(v => obs.next(v));
this.getProject(1).pipe(
tap(project => add(project)),
switchMap(project => this.getSites(1)),
tap(sites => add(sites)),
switchMap(sites => this.getPersons(sites[0].id)),
tap(person => add(person))
);
На этот раз возвращаемое значение будет массивом всех ваших значений.
Наконец, у вас есть сложный синтаксис для их объединения без темы.
this.getProject(1).pipe(
switchMap(project => this.getSites(1).pipe(map(sites => ([project, sites])))),
switchMap(([project, sites]) => this.getPersons(sites[0].id).pipe(map(person => ([project, sites, map])))),
);