Вывод: 1, 9, 10, done. Ошибка на 2 завершает исходную ветку; catchError переключает подписку на of(9,10), а не продолжает источник с 3.
Что выдаёт RxJS после catchError с of?
Вывод: 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.