Технически, вложенная подписка работает, но есть более элегантный и систематический способ справиться с этим.Вы действительно должны больше узнать о своих операторах RxJS.
Сначала мы используем mergeMap для отображения наблюдаемых значений из activRoute во внутреннюю наблюдаемую.
Затем мы используем forkJoin , чтобы объединить наблюдаемые в одно наблюдаемое значение, таким образом, возвращая само значение в .subscribe()
this.activatedRoute.pipe(
tap(data => console.log(data)),
mergeMap(data => {
if (data.product === null) {
this.router.navigate(['/home']);
} else {
const getCurrency = this.dataService.getCurrencySymbolById(data.product.currency);
const getUsers= this.userService.getUser(data.product.createdBy);
const getRatings = this.ratingService.getRatingByUserId(seller.id)
return forkJoin(getCurrency, getUsers, getRatings);
}
})
).subscribe(res => {
console.log(res[0]); // currency
console.log(res[1]); // user
console.log(res[2]); // ratings
}
РЕДАКТИРОВАТЬ: Оказывается, я неправильно прочитал исходный вопрос, так как getRatingsByUserId зависит от getUser.Позвольте мне внести некоторые изменения.В любом случае, я оставлю код выше, как есть, и это хорошо для справки ОП.
this.activatedRoute.data.pipe(
switchMap(data => {
this.user = data['user'];
this.product = data['product'];
return this.userService.getUser(this.product.createdBy);
}),
switchMap(data => {
if (this.product === null) {
this.router.navigate(['/home']);
} else {
this.seller = seller;
return this.userService.getRatingByUserId(this.product.createdBy);
}
})
).subscribe(res => {
console.log(res)
// handle the rest
})