首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rxjs观测器过滤器不工作错误

Rxjs观测器过滤器不工作错误
EN

Stack Overflow用户
提问于 2020-11-23 18:42:00
回答 1查看 509关注 0票数 0

我的服务中有以下代码

代码语言:javascript
运行
复制
        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回调,因为过滤器条件不满足。但是,很明显我这里出了点问题。

我也如何过滤这些错误?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-23 19:14:32

您不能过滤errors,原因与不能过滤completes的原因相同,这是没有意义的。它们预示着一条小溪的尽头。你不能过滤末端。

当然,您可以捕获一个错误,然后什么也不做--这有点像过滤错误。

代码语言:javascript
运行
复制
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
});

当然,您在错误或完成后发送给主题的任何内容都不会起任何作用。

代码语言:javascript
运行
复制
    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

这一最后的号召将一事无成,因为这个主题已经错误/完成了。

类似地:

代码语言:javascript
运行
复制
    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

最后:

代码语言:javascript
运行
复制
    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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64974421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档