BACK
Уроки4. Teardown и unsubscribe
Уроки · 04

4. Teardown и unsubscribe

Зачем нужно уметь отписываться

Не все потоки заканчиваются сами. of(1, 2, 3) завершится через мгновение, а вот interval(1000) будет тикать вечно. То же касается обработчиков событий: пока вы не убрали слушатель, он продолжает работать.

В Angular это особенно важно: компонент исчез с экрана, но если подписка осталась, работа продолжится в фоне. Это называется утечка памяти (memory leak). Поэтому RxJS даёт нам способ аккуратно «выключить» поток.

Глоссарий

  • Subscription — объект, который возвращает .subscribe(). На нём есть метод .unsubscribe().
  • unsubscribe() — команда «выключи этот поток для меня». После вызова значения больше не приходят.
  • Teardown (по-русски — «уборка», «демонтаж») — функция очистки. Это функция, которую возвращает рецепт Observable. RxJS вызовет её, когда подписка завершается (по unsubscribe, complete или error). Здесь обычно останавливают таймеры, закрывают сокеты, снимают обработчики.

Как устроена teardown-функция

new Observable(subscriber => {
  // здесь — стартовая работа
  return () => {
    // здесь — уборка
  };
});

Что нужно сделать

  1. В функции-рецепте первой строкой выведите 'Subscribed'.
  2. Отправьте значение 'tick' через subscriber.next('tick').
  3. В самом конце функции-рецепта верните стрелочную функцию: return () => console.log('Teardown');. Это и есть teardown.
  4. Под кодом подписки добавьте sub.unsubscribe(); — это вызовет teardown.

Ожидаемый порядок: Subscribed → Value: tick → Teardown.

Решение spoiler · click to reveal
const { Observable } = Rx;

const stream$ = new Observable(subscriber => {
  console.log('Subscribed');
  subscriber.next('tick');

  return () => {
    console.log('Teardown');
  };
});

const sub = stream$.subscribe(value => {
  console.log('Value: ' + value);
});

sub.unsubscribe();
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...