Я строю архитектуру на последней версии Angular 6 и, исходя из AngularJS, есть кое-что, о чем я не могу смириться: базовая обработка HTTP-запроса.
Итак, ради вопроса, допустим, я хочу наблюдаемого. Потому что это похоже на будущее Angular.
Я вышел из чего-то очень элегантного в AngularJS:
service.getAll()
.then(onSuccess) // I process the data
.catch(onError) // I do whatever needed to notify anyone about the issue
.finally(onFinally); // I stop the loading spinner and other stuff
Теперь в Angular 6 / RxJS 6 я не понимаю, почему все так сложно и выглядит не так.
Я мог бы найти два способа сделать то же самое, что и выше:
Полная труба
this.service.getAll()
.pipe(
map((data) => this.onSuccess(data)),
catchError(error => of(this.handleError(error))),
finalize(() => this.stopLoading())
)
.subscribe();
Поскольку нам нужно использовать pipe для финализации, я мог бы также использовать pipe для всего, я думаю, что лучше практиковать, чтобы все было в одном и том же порядке. Но теперь мы должны выбросить что-то, называемое «о» (не очень легко понять), и мне это не нравится.
Половина трубы
Поэтому я пробую другую идею, используя только нужную мне трубу (финализирую) и сохраняю обратные вызовы подписки.
this.service.getAll()
.pipe(
finalize(() => this.stopLoading())
)
.subscribe(
(data) => this.onSuccess(data),
(error) => this.handleError(error)
);
Но, хорошо. Разве это не немного отсталый? У нас все еще есть обратные вызовы без реальных имен, и мы завершаем работу перед чтением обработки и ошибки. Weird.
Так что есть кое-что, что я определенно не понимаю. И я не могу найти ничего связанного с этим основным вопросом онлайн. У вас есть кто-то, кто хочет «успех и наконец», или «успех и ошибка», но никто не хочет 3 из них.
Может быть, я слишком стар, и я не понимаю новую лучшую практику об этом (если так, пожалуйста, обучите меня!).
Моя потребность проста:
1. Я хочу обработать данные, полученные от службы
2. Я хочу получить ошибку для отображения пользователю
3. Я хочу остановить загрузочный счетчик, который я только что начал перед вызовом, или сделать еще один вызов, если первый вызов завершился успешно или произошла ошибка (я действительно хочу окончательно)
Как вы справляетесь с вашим базовым HTTP-вызовом с помощью наблюдаемого?
(я не хочу никаких .toPromise
, пожалуйста, я хочу понять, как поступить с новым материалом)