【问题标题】:How to clear previous and send only the latest value in RxJS Subject?如何清除 RxJS 主题中的先前值并仅发送最新值?
【发布时间】:2019-12-25 15:10:30
【问题描述】:

我的 Angular 应用程序中有一个网格,其中行中有按钮,单击按钮时,它会打开相应的弹出窗口。我创建了一个具有BehaviourSubject 属性的服务,即popupEventSubject$

我面临的问题是,当我打开和关闭该行中的一个弹出窗口,然后打开另一个弹出窗口时,前一个弹出窗口会在当前弹出窗口旁边打开。我怀疑的问题是,由于RxJS 中的Subjects 发出先前的值(订阅时),所以在我的情况下,BehaviourSubject 正在维护先前事件的队列,并且当调用订阅时,它会显示所有队列中的事件,即打开以前的弹出窗口。

那么,有没有办法清除正在创建的“队列”?

理想情况下,我正在寻找我的BehaviourSubjectAsyncSubject 一样工作,我尝试用AsyncSubject 替换BehaviourSubject,但它似乎没有发出初始事件。我使用AsyncSubject 在我的主题服务的构造函数中尝试了this.popupEventSubject$.emit(null),但它仍然无法订阅。

我想在弹出窗口关闭时取消订阅该主题,但由于主题不再可用,因此不会打开其他弹出窗口。

另外,我想避免在每次发出事件以清除queue 后发出null

【问题讨论】:

  • 为什么不直接使用普通的Subject
  • 你能提供一些你所做的代码吗?
  • 请在一些在线编辑器中提供代码将是最好的。在我看来,主题对于那个例子来说已经足够了。但是,请提供代码,我们可以提供更多建议...

标签: angular rxjs behaviorsubject subject-observer


【解决方案1】:

当您关闭弹出窗口取消订阅时,这是发生的,因为您打开弹出窗口时会添加新订阅。所以请先清除以前的订阅。

【讨论】:

  • 如果我取消订阅,我将无法再点击任何弹出窗口,因为我需要重新初始化主题
  • @testsys123 请提供一些示例代码以详细查看问题。
猜你喜欢
  • 2020-11-13
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多