3

编辑:描述的错误在版本 6.2.1 中消失了

我使用 rxjs-tslint 包中的(运行良好(!))迁移工具将项目从 rxjs5 迁移到 rxjs6。在某些情况下,我以前运行良好的错误处理不再捕获错误。

使用 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.
4

1 回答 1

0

下面的代码有效,错误消息打印在错误函数范围内。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)
)
于 2018-06-18T09:45:05.050 回答