AO
Size: a a a
AO
SФ
AO
SФ
SФ
AO
SФ
AO
AO
AO
SФ
SФ
SФ
AO
A
DМ
DP
DМ
AO
// все вызовы getAuthor('id1') проталкивают в этот 👇 Observable
readonly getAuthor = this.effect((ids$: Observable<string | undefined>) => {
return ids$.pipe(
// иногда отфильтровать сначала надо
filter((id): id is string => !!id),
// очень часто с вызовами API сначала на спиннер поставить
tap(() => this.updateStatus('loading')),
// вот тут мы выбираем оператор для избежания race conditions
switchMap((id) =>
// вызов самого сервиса
this.authorService.getAuthor(id).pipe(
// здесь мы на самом деле засунем полученные данные в сам сейт
tap({
next: (author) => {
this.setAuthor(author);
this.updateStatus('loaded');
},
// и обработаем ошибку
error: (e) => this.updateStatus('error'),
}),
// убедимся, чтобы ошибка не закрывала наш еффект
catchError(() => EMPTY)
)
)
);
});
}
AO