BACK
Уроки10. EMPTY и throwError
Уроки · 10

10. EMPTY и throwError

Два специальных потока

Иногда нужно вернуть Observable «без полезных данных». Например, в ветке условия: «если что-то пошло так, верни пустоту», «если что-то пошло не так, верни ошибку». Для таких случаев в RxJS есть два готовых источника.

EMPTY — пустой поток

EMPTY — это уже готовый Observable. Он не отправляет ни одного значения через next и сразу же завершается через complete.

EMPTY
// complete() — и всё

Пригодится, когда сигнатура функции требует вернуть Observable, но у вас нет данных, и ошибки тоже не было.

throwError — поток-ошибка

throwError(factory) создаёт поток, который при подписке сразу падает с ошибкой. factory — это функция, возвращающая объект ошибки.

throwError(() => 'Boom')
// error('Boom') — и всё

Почему передаётся функция, а не сама ошибка? Чтобы новый объект ошибки создавался каждый раз при подписке — это безопаснее и удобнее для отладки.

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

  1. Подпишитесь на EMPTY. В объекте подписки укажите только обработчик complete, который выведет 'Empty complete'.
  2. Замените Rx.EMPTY у failed$ на throwError(() => 'Boom').
  3. Обработчик ошибки уже выводит Error: Boom — менять его не нужно.
  4. Ожидаемый вывод: Empty complete → Error: Boom.
Решение spoiler · click to reveal
const { EMPTY, throwError } = Rx;

EMPTY.subscribe({
  complete: () => console.log('Empty complete')
});

const failed$ = throwError(() => 'Boom');

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