【问题标题】:RxJava combineLatest() how to know which observable emitted a value?RxJava combineLatest() 如何知道哪个 observable 发出了一个值?
【发布时间】:2018-01-22 11:10:23
【问题描述】:

我有代码

Observable.combineLatest(leftObservable, rightObservable, Pair::new)
    .switchMap(pair -> {
        final Department department = pair.first;
        final Person person = pair.second;
        if(/*person has changed*/){
            // do something
        }
        return repository.loadHourlyTable(department , person);
    });
    ...

如何知道哪个 observable 被改变了?

【问题讨论】:

  • 你为什么想知道这个?如果你想对单个 Observable 的变化做出反应,让 observable 变热并通过多种方式观察它。 combineLatest 的工作是在所有来源都具有最新值时发出信号,并在每次发生任何变化时发出信号,提供最新值。
  • @akarnokd 所以没有办法知道哪个 observable 使用 combineLatest 发出了一个值?
  • 将项目包装成元组,以某种方式识别源并在 combineLatest 中组合它们。

标签: rx-java rx-java2


【解决方案1】:

这可能是应用 RxJava 的一种容易出错的方式。

假设我们想发出librarian-library 然后是court-lawyer,没有办法避免一些中间状态。

Department + Person    => Pair
Library    + Librarian => library-librarian
Court      + Librarian => court-librarian   // wrong!
Court      + Lawyer    => court-lawyer

解决方案取决于向您提供数据的方式。如果每个 Observable 都是独立的,并且其中一个的每个索引对应另一个的相同索引,则应使用 zip 而不是 combineLatest

或者,如果您从 Person 检索部门(反之亦然)并且它是可以更改的流

personObservable.switchMap(person -> person.department()
    .map(department -> new Pair<>(person, department))
  .switchMap({ pair -> repository.loadHourlyTable(pair.first , pair.second) });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多