【问题标题】:RxJS BehaviorSubject without initial value on subscribe订阅时没有初始值的 RxJS BehaviorSubject
【发布时间】:2019-11-26 13:52:43
【问题描述】:

我有一个 Angular 应用程序,我在其中使用 RxJS BehaviorSubject 订阅一个表示“进行中”状态的 bool 值。

但我只关心状态何时发生变化,而不是订阅的当前状态。

export class ProgressService {
  private InProgress$ = new BehaviorSubject<boolean>(false);

  constructor() {}

  public getInProgressStateSubject() {
    return this.InProgress$;
  }
}

...

this.progressService.getInProgressSubject().subscribe((inProgress: boolean) => {

  // This will be triggered in the moment of subscription as well as on state chages

  if (inProgress) {
    // Toggle on state
  } else {
    // Toggle off state
  }
});

我喜欢它的工作方式,我只是不希望它在订阅时触发。

RxJS 中是否有其他类似的运算符可以帮助我,或者我可以用其他方式来做吗?

谢谢!

【问题讨论】:

  • 简单地使用普通的旧主题?这仍然为您提供 next()。
  • 哦,麻烦...谢谢!我相信这就是我正在寻找的。出于某种原因,我认为 Subject 没有 next() 方法来触发更改,甚至没有尝试 =P
  • 主体和行为主体之间的最大区别在于行为主体存储最后发出的值,而新订阅者在订阅时获得最后发出的值。有了一个主题,新订阅者在下一次发出之前不会得到一个值。
  • 感谢@AdrianBrand 的解释!

标签: angular rxjs


【解决方案1】:

我认为有几种选择:

  • 使用Subject
  • 保留 BehaviorSubject,但使用 skip(1) 管道忽略第一个值

【讨论】:

    【解决方案2】:

    您可以将ReplaySubject 与 bufferSize 1 一起使用,它们只有 1 个值和最后一个。

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 2017-01-22
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多