Об subscribe() vs async

Задуматься об этом выборе меня заставило архитектурное rxjs tslint правило rxjs-prefer-async-pipe :

Disallows the calling of subscribe within an Angular component.

Оно гласит, что запрещено вызывать метод subscribe() в Angular компонентах. Стало интересно откуда ноги растут.

Недавно наткнулся на статью The Ultimate Answer To The Very Common Angular Question: subscribe() vs | async Pipe, где подбробно разбираются оба подхода.

subscribe() vs async

Отобразить значение Observable возможно 2 способам:

  • Вручную: метод subscribe() -> сохранение состояние в коде компонента
    todos$.subscribe(todos => this.todos = todos)

    Метод требует ручной отписки, например takeUntil(destroy$) или unsubscribre().

  • Автоматически: | async pipe -> разворачивание состояние прямо в шаблоне компонента
    <li *ngFor="let todo of todos$ | async"></li>`

    Работает магия. Метод не требует ручной отписки.

В привидённой статье оказалось 2 интересных момента:

  1. Касательно OnPush стратегии обнаружения изменений.

    • Подписка на Observable вручную в хуке ngOnInit() не отображает изменений состояния в шаблоне. Требуется вручную вызывать markForCheck() внутри подписки.
    • !!! async работает с OnPush стратегией из коробки! Просто убедитесь, что всегда приходят новые объекты (immutable logic).
  2. Решение с несколькими | async pipes развёрнутых в одну переменную:

    multiple_async_pipes.png

P.S. Такие скриншоты кода делаются через сервис https://carbon.now.sh/

P.P.S.

<ng-container
  *ngIf="
    {
      title: title$ | async,
      group: group$ | async,
      state: buttonState$ | async,
      config: config$ | async
    } as data;
    else loading
  "
  [formGroup]="data.group"
  (ngSubmit)="onSubmit()"
></ng-container>

Похожие записи

Angular. Can't set breakpoints in VS Code

Вариант решения проблемы, когда не срабатывают точки остановки при разработке Angular приложений в редакторе VS Code
10 апреля 2018 г. в Angular

RxJs Subjects

Выдержки из доклада Андрея Алексеева (Tinkoff) про RxJs (Subject, Behaviour Subject, Replay Subject, Async Subject). Применение в Angular.

Upload файла в Angular по клику кнопки

Создано простейшее nestjs приложение, принимающее файлы. Выбор и отправка файла по клику подразумевает, что на форме отсутствует input для файла. Отправка запроса осуществляется с отслеживанием прогресса.

Angular. Редирект по условию

Пример условного перенаправления пользователя в зависимости от некого количества

  • 0 - dashboard
  • 1 - карточка
  • 2 и более - список
10 января 2019 г. в Angular