rxjs6 обработка ошибок при использовании switchMap - PullRequest
0 голосов
/ 08 июня 2018

РЕДАКТИРОВАТЬ: описанная ошибка исчезла в версии 6.2.1

Я перенес проект с rxjs5 на rxjs6 с помощью (хорошо работающего (!)) Инструмента миграции в rxjs-tslintпакет.В некоторых случаях моя обработка ошибок, которая раньше работала нормально, больше не улавливала ошибку.

Есть ли что-то новое в области видимости и / или распространении ошибок при использовании switchMap?И как я могу поймать ошибку снова?

Вот рабочий пример

Rx.of(undefined).pipe(
  tap(() => console.log("WORKING")),
  mergeMap(boom => boom),
  catchError(err => Rx.throwError("ERROR CATCHED"))
).subscribe((data) => {
  console.log(data);
},(err) => {
  console.log("ERROR:", err);
})

Вывод:

WORKING
ERROR: ERROR CATCHED

Не работает пример:

Rx.of("foo").pipe(
  switchMap(() => Rx.of(undefined).pipe(
    tap(() => console.log("NOT WORKING")),
    mergeMap(boom => boom),
    catchError(err => Rx.throwError("ERROR NOT CATCHED"))
  ))
).subscribe((data) => {
  console.log(data);
},(err) => {
  console.log("ERROR:", err);
})

Вывод:

NOT WORKING
ERROR: TypeError: You provided 'undefined' where a stream was expected.
       You can provide an Observable, Promise, Array, or Iterable.

1 Ответ

0 голосов
/ 18 июня 2018

Приведенный ниже код работает, сообщение об ошибке выводится внутри области действия ошибки.Предполагается, что mergemap возвращает наблюдаемое, но для этого примера оно намеренно исключено, чтобы вернуть неопределенное значение, чтобы вызвать ошибку.

const { of, throwError } = require('rxjs')
const { switchMap, tap, mergeMap, catchError } = require('rxjs/operators')

of('foo').pipe(
   switchMap(val => of(undefined).pipe(
   tap(() => console.log('NOT WORKING')),
   mergeMap(val => val),
   catchError(err => throwError("ERROR NOT CATCHED"))
  ))
).subscribe(
   data => console.log('success', data),
   error => console.log(error)
)
...