Что выдаёт RxJS после catchError с of?

Вывод: 1, 9, 10, done. Ошибка на 2 завершает исходную ветку; catchError переключает подписку на of(9,10), а не продолжает источник с 3.

Короткий ответ

Что ответить на собеседовании

Вывод: 1, 9, 10, done. Ошибка на 2 завершает исходную ветку; catchError переключает подписку на of(9,10), а не продолжает источник с 3.

Подробный разбор

Ответ с пояснениями

Условие

Для RxJS 7 определите последовательность:

import { of, map, catchError } from 'rxjs';
of(1, 2, 3).pipe(
  map(x => { if (x === 2) throw new Error('stop'); return x; }),
  catchError(() => of(9, 10))
).subscribe({
  next: x => console.log(x),
  complete: () => console.log('done')
});

Ответ

Вывод: 1, 9, 10, done. Ошибка на 2 завершает исходную ветку; catchError переключает подписку на of(9,10), а не продолжает источник с 3.

Первый элемент проходит map. На втором обработчик бросает исключение, которое оператор передаёт в канал error. CatchError заменяет ошибочный поток новым observable, выдающим 9 и 10 и затем complete. Поэтому ни значение 2, ни 3 не появляются. Положение catchError внутри или снаружи составной цепочки влияет на область восстановления; здесь он относится ко всему исходному pipe.

Источник: rxjs.dev.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее