【问题标题】:Why RXJS angular behaviorSubject emit mutiple values为什么 RXJS angular behaviorSubject 发出多个值
【发布时间】:2018-07-02 13:36:28
【问题描述】:

enter image description here我使用BehaviorSubject 在我的应用程序组件之间共享数据,由于BehaviorSubject 多次发射相同的值,我遇到了性能问题。例如,我调用http从后端获取团队对象并将其存储在behaviourSubject中,许多组件订阅此BehaviorSubject。每个组件都从订阅中获取值并对值进行一系列操作。问题的本质是该值被多次发出,每个组件都执行几次序列。我的猜测是BehaviorSubject 将值作为订阅者的数量发出。我在谷歌中找不到任何对我来说很奇怪的东西,我错过了什么?

与部署相比,团队在本地发出值的次数不同。可以看到“refetch returned value”的打印是http的实际响应。

【问题讨论】:

  • 您的BehaviorSubject 的目的是什么?如果您的目标是共享数据,为什么不简单地将请求的结果存储在一个变量中?
  • 其实我认为这与http延迟时间有关。那么如何过滤那些没有任何价值的虚假发射。
  • 你好,优酷乐乐,目的是为了能够订阅这个值,并根据最后存储的值更新各个组件
  • 你应该至少提供你的代码的相关部分,或者更好的堆栈闪电,这样我们就可以找到你的实现中的错误

标签: angular rxjs behaviorsubject


【解决方案1】:

您可以通过仅接受与上一个不同的值来部分修复它,从而跳过连续多次评估相同的值。

此外,如果您查询的数据可以与之前的查询相同,那么无论如何添加它可能是个好主意:

import { distinctUntilChanged } from 'rxjs/operators';

this.myService.myObservable
    .pipe(distinctUntilChanged())
    .subscribe(value => {
        console.log(value);
    })

【讨论】:

  • 我们甚至不知道 OP 尝试了什么。我认为这是一个肮脏的解决方法,必须有一个更清洁的解决方案
  • 同意。它可能不是解决方案(已接受的答案),但它至少可以帮助那些在发出多个相同值时遇到性能问题的人。此外,OP 无论如何添加它可能不是一个坏主意。
  • 感谢您的反馈,但我仍然在努力。
  • @Adam007 如果您不向我们展示您的代码,我们很难为您提供帮助。请这样做。
  • this.tsub = this.dyn.team$.subscribe(team => { if (team) { console.log('team emit value'); }});
猜你喜欢
  • 2020-09-07
  • 1970-01-01
  • 2019-12-14
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2018-10-04
相关资源
最近更新 更多