Когда использовать Observables и Promises в Angular - PullRequest
3 голосов
/ 12 марта 2019

Прочитав много об Observables после того, как они пришли из большого приложения, основанного на Promise, я понимаю их силу в использовании потоков / шаблонов событий, однако я чувствую, что бывают случаи, когда Observables чувствует себя неуклюже и излишне.

Когда вы хотите получить некоторые данные, особенно для страничных данных, Observable идеально подходит.Вы можете подключить начальный размер и смещение для пейджинга, а обновления страницы и размера инициируют обновление наблюдаемой, и она выбирает больше данных, преобразует их и т. Д.

Однако, когда мы что-то делаемпросто как запрос DELETE на /api/books/123, и нет никакого ценного ответа, неудобно использовать Observables, поскольку нечего «наблюдать», и вы должны «инициировать» запрос, который будет сделан, подписавшись на него.

Вот пример:

Обещание

await myService.DeleteBook('123');
// the book is now deleted

Наблюдаемый

myService.DeleteBook('123')
// the book is still there as the request isn't sent yet
.subscribe(x => {
   // finally in here the book is deleted, but 'x'
   // is pretty much worthless so this method pretty much does nothing.
});

Итакна ум приходит несколько вещей:

  1. Мне очень неудобно подписываться на запрос DELETE
  2. Это дополнительный код, практически бесполезный
  3. Мне нравится, как я могу контролироватьблокирую ли я Обещание простым добавлением / удалением await из строки

Все блоггеры и статьи, которые я вижу вокруг Observables, похоже, все время сосредоточены на использовании Observables и никогда не используют Promises.

Этот парень , казалось, был единственным человеком, который "встал" перед Observables и пытался спорить, почему их следует использовать только тогда, когда они имеют смысл, но все комментариилюди просто избивают его и говорят, что Наблюдаемые - все еще серебряная пуля.

Может ли кто-нибудь объяснить мне, почему существует такая решительная позиция по поводу использования Наблюдаемых во всех случаях прямо?

Ответы [ 3 ]

2 голосов
/ 13 марта 2019
myService.DeleteBook('123')
// the book is still there as the request isn't sent yet
.subscribe(x => {
   // finally in here the book is deleted, but 'x'
   // is pretty much worthless so this method pretty much does nothing.
});
  • "х" не совсем бесполезен.Вы все еще хотите проверить ответ и показать сообщение об успехе соответственно или обработать ошибку HTTP в обратном вызове ошибки.Правильно?С обещаниями вам нужно будет обернуть его, чтобы попытаться / отловить ошибку HTTP.

  • Другая лучшая вещь о наблюдаемых - это то, что они могут быть объединены с другими наблюдаемыми и объединены в цепочки.Если вы посмотрите на операторов RXJS, вы можете сделать с ними довольно интересные вещи.Операторы делают удовольствие от работы с наблюдаемыми.

  • Например, в вашем случае представьте, что перед удалением необходимо показать диалоговое окно с предупреждением.Вы можете связать удаление, наблюдаемое с предупреждением, наблюдаемым вместе с оператором фильтра, чтобы удалять, только если пользователь нажал «Да».Этого было бы легче достичь, если вы используете наблюдаемые над обещаниями.

  • Также по соображениям согласованности вы хотите, чтобы везде использовался один и тот же шаблон подписки.Например, вы не хотите использовать Promise в одном месте и наблюдаемые в других, чтобы сбить с толку других разработчиков.

0 голосов
/ 13 марта 2019

Наблюдаемые значения намного больше, чем вы упомянули.Они не о потоковой передаче, не об обработке событий, даже не о композиции, хотя все эти факторы имеют значение.Observable<T> - своего рода сверхдержава T: как только вы ее получите, вы не сможете вернуться.Человек-паук никогда не мог стать просто Питером Паркером.В частности, это означает, что вы «поднимаете» свой обычный код, тем самым давая ему прекрасную возможность делать ... все удивительные вещи, которые делает rx.

Лучший способ понять rx - это рассматривать его как обобщенную функцию- тот, который может делать бесконечно много return заявлений с течением времени.Попытка избавиться от этого единственного вида избавления от… самих функций.Вместо того, чтобы пытаться избавиться от него, вы должны попытаться вписать в него свое решение точно так же, как вы определяете свое абстрактное решение в терминах определенных классов, оснащенных определенными функциями определенных сигнатур или дажеголые экспортируемые функции.В некоторых случаях требуется, чтобы вы отобразили что-то, что (пока) не поддается наблюдению (например, обещание), на семантически равную наблюдаемую (это делает from(...)).Поэтому вы должны свободно использовать эти картографы без всяких сомнений.

Дайте мне знать, если потребуется более подробное объяснение.

0 голосов
/ 12 марта 2019

Я бы, как правило, согласился с вами, особенно для случаев использования здесь, а также даже для GET.Для Angular мне нравится .toPromise():

let book = await httpObservableService.GetBook('123').toPromise()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...