我的服务中有以下代码
let b = new BehaviorSubject({ a: undefined })
let o = b.asObservable();
o.pipe(filter(_ => _.a === 5)).subscribe(() => {
debugger;
}, error => {
debugger
})
b.next({ a: 10 })
b.next({ a: 5 })
b.error({ a: 10 })
当我调用b.next({a:10})时,当我调用b.next({a:5})时,它不会命中onNext回调中的调试器,而是击中onNext回调中的调试器。当我调用b.error({a:10})时,它会击中onError回调中的调试器。
我的期望是不应该调用onError回调,因为过滤器条件不满足。但是,很明显我这里出了点问题。
我也如何过滤这些错误?
提前谢谢你。
发布于 2020-11-23 19:14:32
您不能过滤error
s,原因与不能过滤complete
s的原因相同,这是没有意义的。它们预示着一条小溪的尽头。你不能过滤末端。
当然,您可以捕获一个错误,然后什么也不做--这有点像过滤错误。
o.pipe(
catchError(err =>
err?.a === 5 ?
return of(err) :
EMPTY
),
filter(val => val.a === 5)
).subscribe({
next: val => debugger,
error: err => debugger,
complete: () => debugger
});
当然,您在错误或完成后发送给主题的任何内容都不会起任何作用。
b.next({ a: 10 }); // Filtered, not emitted
b.next({ a: 5 }); // value emitted
b.error({ a: 5 }); // caught and new non-error { a: 5 } emitted as value. subject 'b' is done
b.next({ a: 5 }); // Does nothing
这一最后的号召将一事无成,因为这个主题已经错误/完成了。
类似地:
b.next({ a: 10 }); // Filtered, not emitted
b.next({ a: 5 }); // value emitted
b.complete(); // subject 'b' is done
b.next({ a: 5 }); // Does nothing
最后:
b.next({ a: 10 }); // Filtered, not emitted
b.next({ a: 5 }); // value emitted
b.error({ a: 10 }); // caught and not emitted. subject 'b' is done
b.next({ a: 5 }); // Does nothing
https://stackoverflow.com/questions/64974421
复制相似问题