BACK
Уроки37. finalize: cleanup после завершения или ошибки
Уроки · 37

37. finalize: cleanup после завершения или ошибки

finalize — уборка «в любом случае»

Помните teardown из четвёртого урока? Он позволял делать cleanup внутри Observable. Но иногда уборка нужна на уровне pipe — после конкретной цепочки операторов. Для этого есть finalize.

finalize(fn) выполняет функцию fn в трёх случаях:

  • Поток успешно завершился (complete).
  • Поток упал с ошибкой (error).
  • Подписчик отписался (unsubscribe).

Классический Angular-пример

this.loading = true;
this.http.get(...).pipe(
  finalize(() => this.loading = false)
).subscribe(...)
// независимо от исхода — индикатор уйдёт

Порядок логов

Важно: finalize выполняется после complete подписчика, а не до. Поэтому в этом уроке порядок будет: Value: Data → Complete → Cleanup.

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

  1. В pipe добавьте finalize(() => console.log('Cleanup')).
Решение spoiler · click to reveal
const { of, finalize } = Rx;

const request$ = of('Data').pipe(
  finalize(() => console.log('Cleanup'))
);

request$.subscribe({
  next: value => console.log('Value: ' + value),
  complete: () => console.log('Complete'),
});
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...