Все дело в разделении проблем.
Одним из основных преимуществ использования catchError
является отделение всей логики поиска данных, включая все ошибки, которые могут возникнуть на пути от представления данных.
Пусть Компоненты должны заботиться только о представлении данных
Компоненты должны заботиться только о данных (есть они или нет).Они не должны заботиться о специфике того, как извлекать данные или обо всех вещах, которые могут работать неправильно во время извлечения данных.
Компоненты не должны извлекать или сохранять данные напрямую, и они, безусловно, не должнысознательно представлять поддельные данные.Они должны сосредоточиться на представлении данных и делегировать доступ к данным службе. [Угловое руководство]
Допустим, ваши данные представляют собой список элементов.Ваш Компонент вызовет функцию service.getItemList()
и, поскольку он заботится только о данных, будет ожидать:
- список, содержащий элементы
- пустой список
- нетто есть
null
или undefined
Вы можете легко обработать все эти случаи с помощью ngIf
в шаблоне компонента и отобразить данные или что-то еще в зависимости от случая.Наличие функции Service, возвращающей «чистый» Observable, который возвращает только данные (или null
) и не должен вызывать каких-либо ошибок, делает код в ваших компонентах простым, поскольку вы можете легко использовать AsyncPipe вшаблон для подписки.
Не позволяйте компонентам заботиться о таких особенностях извлечения данных, как ошибки
Ваша логика поиска и обработки ошибок может со временем изменяться.Возможно, вы переходите на новый Api и вдруг столкнетесь с различными ошибками.Не позволяйте вашим компонентам беспокоиться об этом.Переместите эту логику в службу.
Удаление доступа к данным из компонентов означает, что вы можете в любое время изменить свое решение о реализации, не касаясь каких-либо компонентов.Они не знают, как работает сервис. [Angular tutorial]
Поместите логику поиска данных и обработки ошибок в Сервис
Обработка ошибок является частью вашей логики поиска данных, а не частью вашейлогика представления данных.
В вашей Службе поиска данных вы можете подробно обработать ошибку с помощью оператора catchError
.Может быть, есть некоторые вещи, которые вы хотите сделать для всех ошибок, таких как:
- log it
- отображение ориентированного на пользователя сообщения об ошибке в качестве уведомления (см. Показать сообщения )
- извлечение альтернативных данных или возврат значения по умолчанию
Перемещение части этого в функцию this.handleError('getHeroes', [])
предотвращает дублирование кода.
После сообщения об ошибке консоли, обработчик создает удобное для пользователя сообщение и возвращает безопасное значение приложению, чтобы оно могло продолжать работать. [Angular tutorial]
Может также наступить время, когда вам нужно будет вызвать существующую сервисную функцию из нового Компонента.Наличие вашей логики обработки ошибок в функции Service делает это простым, поскольку вам не придется беспокоиться об обработке ошибок при вызове функции из нового компонента.
Таким образом, все сводится к разделению логики поиска данных (вСлужбы) из вашей логики представления данных (в компонентах) и простоты расширения вашего приложения в будущем.