Typescript-在分解结构时修改数组值
假设我有一段代码:Typescript-在分解结构时修改数组值,typescript,rxjs,Typescript,Rxjs,假设我有一段代码: const [val$, err$] = partition(result => ...)(httpSource$) const valid$ = val$.pipe( tap(() => ...), map(result => ...) ) const error$ = err$.pipe( tap(() => ...), map(result => ...) ) 通过在赋值之前修改分区返回值,我可以避免创建v
const [val$, err$] = partition(result => ...)(httpSource$)
const valid$ = val$.pipe(
tap(() => ...),
map(result => ...)
)
const error$ = err$.pipe(
tap(() => ...),
map(result => ...)
)
通过在赋值之前修改
分区
返回值,我可以避免创建val$
和err$
变量吗?通常不需要仅为错误处理而对可观察对象进行分区。相反,我们可以使用throwError
创建函数来创建错误通知。在subscribe
调用中分别处理错误通知(subscribe
的第二个参数是在发生错误时调用的函数)
自定义错误处理的典型示例如下所示:
$httpSource.pipe(
mergeMap(res =>
res.error ?
throwError(res.error) :
of(res.value)
),
tap(next => ..., err => ...)
).subscribe(
next => ...,
err => ...
)
我使用的是mergeMap
,因为throwError
创建了一个必须合并到外部可观察对象中的内部可观察对象。请注意,tap
和subscribe
都为错误处理函数提供了第二个参数
关于错误通知的更多信息:定义了三种可以沿链传递的通知类型。其中之一是错误通知,其定义如下:
[错误通知]表示可观察对象已在指定的错误条件下终止,并且它将不会发出进一步的项
捕获和重新触发错误:如果错误通知沿着可观察链出现,我们可以通过使用捕获错误
,优雅地捕获该错误并将其转换为不同的通知:
$httpSource.pipe(
catchError(err => throwError(new CustomError(err)))
).subscribe(
next => ...,
err => ...
)
不,但是你为什么要创建两个可观察的对象呢?可观察模型中已经有一个错误通知。@ggradnig,因为我使用自定义函数进行区分(这就是为什么我使用
分区
)。但也许我可以简化。你能详细介绍一下“错误通知”吗?谢谢。疑问:如果我抛出一个自定义错误类型,在subscribe
上,错误类型可能会变成MyCustomType | HttpErrorResponse
(后者来自HttpClient
),或者我错了吗?恐怕错误通知当前有一个any
类型。也许这会在RxJS 7中有所改变,但目前你必须手动输入。我知道,我希望他们会在这方面有所改进。无论如何,该类型将成为一个联合,就像我上面写的那样,对吗?如果$httpSource可以生成一个HttpErrorResponse
作为错误通知,那么是的,错误值可以是这个类型或您的自定义类型。这并不是说您必须只检查这两种类型。管道中的每个操作员都可能引入新错误,例如使用first
可能会导致清空错误。