假设我有以下代码:
this.service1
.getValues()
.pipe(
mergeMap(response => this.service2.getMoreValues(response.id)),
catchError(err => of({}))
)
.subscribe(response) => {
console.log(response)
});
我的问题是:如果调用catchError,则新值不再用于我的订阅。我想做的是:如果调用catchError,则返回类似空对象的内容并正常进行,仍然期望新值来自我的服务。
有人可以告诉为什么在catchError被触发后,订阅不再起作用了吗?谢谢。
答案 0 :(得分:1)
这是正确的行为。 catchError
将订阅其回调返回的Observable。
这意味着,如果希望它继续从Observable源发出值,则可以重新订阅它。
import { concat } from 'rxjs';
const source = this.service1
.getValues()
.pipe(
mergeMap(response => this.service2.getMoreValues(response.id)),
catchError(err => concat(
of({}),
source,
)),
);
// Maybe this would work as well, but I didn't test it
// catchError((err, caught) => concat(
// of({}),
// caught,
// )),
source.subscribe(response) => {
console.log(response)
});
最终,retry()
运算符会自动为您重新订阅,但是您在重新订阅之前将无法通过of({})
。
答案 1 :(得分:0)
我想做的是:如果调用catchError,则返回类似空对象的内容
尝试像这样在of({})
中返回catchError
:
this.service1
.getValues()
.pipe(
mergeMap(response => this.service2.getMoreValues(response.id)),
catchError(err => {
return of({});
})
)
.subscribe(response) => {
console.log(response)
});