RxJava - 如何用takeUntil操作重复两个观测值,其中一个观测值取决于其他观测值。

问题描述 投票:0回答:1

我有一个场景,我需要调用search api,根据地图上的搜索半径获得一个特定项目的列表。要求至少显示五个结果。在我的案例中,我有两个Apis(两个观测值)。首先我需要调用 getExpandedSearchRadius() 获取半径并进行第二次调用。doSearch() 以半径为参数。假设 doSearchApi 调用只返回2个结果,我需要重复这两个api调用,直到我得到最小的5个结果。每次重复调用 getExpandedSearchRadius 需要调用返回一个新的扩展半径并执行 doSearch 与新的半径。

这里的问题是每次 repeat() 叫做 getExpandedSearchRadius Api没有执行,只有第二次调用是以初始半径执行的,结果是相同的searchResponse,下面是我试过的一个例子。

getExpandedSearchRadius().flatMap{ radius -> doSearch(radius)}
                      .repeat()
                      .takeUntil(searchResponse.getItems().size >=5)
                      .map(anotherClass::displayOnMap)
java rx-java2
1个回答
1
投票

你可以使用Observable.defer(),因为它作为一个Observable工厂,然后,当重复操作符生效时,构建工厂.defer()会创建另一个新的observable,并且也会调用getExpandedSearchRadius()。

参见文档: (Defer 操作符)

示例代码:

Observable.defer(() -> getExpandedSearchRadius())
        .flatMap{ radius -> doSearch(radius)}
                  .repeat()
                  .takeUntil(searchResponse.getItems().size >=5)
                  .map(anotherClass::displayOnMap)
© www.soinside.com 2019 - 2024. All rights reserved.