说我有这段代码:
const [val$, err$] = partition(result => ...)(httpSource$)
const valid$ = val$.pipe(
tap(() => ...),
map(result => ...)
)
const error$ = err$.pipe(
tap(() => ...),
map(result => ...)
)
是否可以通过在赋值之前修改val$
返回值来避免创建err$
和partition
变量?
答案 0 :(得分:2)
通常不需要仅为观察错误而对Observable进行分区。相反,我们可以使用throwError
创建函数来创建错误通知。错误通知是在您的subscribe
调用中单独处理的(subscribe
的第二个参数是在错误时调用的函数)。
自定义错误处理的典型示例如下:
$httpSource.pipe(
mergeMap(res =>
res.error ?
throwError(res.error) :
of(res.value)
),
tap(next => ..., err => ...)
).subscribe(
next => ...,
err => ...
)
我正在使用mergeMap
,因为throwError
创建了一个内部Observable,必须将其合并到外部Observable中。请注意,tap
和subscribe
都为错误处理函数使用了第二个参数。
有关错误通知的更多信息:Observable Contract定义了可沿链传递的三种通知类型。其中之一是 error 通知,其定义为:
[错误通知]指示Observable已终止,并带有指定的错误情况,并且将不再发射任何物品
捕获和重新抛出错误:如果在Observable链中出现错误通知,我们可以使用catchError
优雅地捕获该错误并将其转换为其他通知:
$httpSource.pipe(
catchError(err => throwError(new CustomError(err)))
).subscribe(
next => ...,
err => ...
)