Это действительно требует некоторых знаний rxjs.
this.categoryService.getCategory(budgetMonthID).pipe(
tap((categories) => this.categoryList = categories),
mergeMap((categories) => zip(
...categories.map(
(category) => this.transactionService.getTransaction(budgetMonthID, category.id)
)
)
).subscribe((rows) => {
this.rows = rows;
});
Для начала мы используем нажмите , чтобы сохранить категории в categoryList
.Это оператор, который просто выполняет функцию, но не влияет на поток в конвейере.
После этого мы используем mergeMap , который выбирает категории и возвращает другое наблюдаемое.В этом случае zip
, который ожидает завершения всех параметров перед отправкой в виде массива, который будет выбран подписчиком.
Вы также можете попытаться получитьпосмотри на встроенную async
трубу от угловой.Это устраняет необходимость отмены подписки внутри вашего компонента и сохраняет его в чистоте.Это изменит ваш код на это:
this.categoryList$ = this.categoryService.getCategory(budgetMonthID).pipe(
shareReplay(1)
);
this.rows$ = this.categoryList$.pipe(
mergeMap((categories) => zip(
...categories.map(
(category) => this.transactionService.getTransaction(budgetMonthID, category.id)
)
)
);
В вашем шаблоне вы можете получить к нему следующий доступ:
<div *ngFor="let category of categoryList$ | async"></div>
<div *ngFor="let row of rows$ | async"></div>