rxJava combineLatest()如何知道哪个observable发出了一个值?

时间:2018-01-22 11:10:24

标签: rx-java rx-java2

我有一个代码

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);
    });
    ...

如何知道哪个观察者被改变了?

1 个答案:

答案 0 :(得分:0)

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

假设我们要先发布图书馆馆员然后是法庭律师,这是无法避免的中间状态。

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

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

或者,如果您从“人员”中检索部门(反之亦然),则该部门可以更改

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