我有一个场景,我需要调用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)
你可以使用Observable.defer(),因为它作为一个Observable工厂,然后,当重复操作符生效时,构建工厂.defer()会创建另一个新的observable,并且也会调用getExpandedSearchRadius()。
参见文档: (Defer 操作符)
示例代码:
Observable.defer(() -> getExpandedSearchRadius())
.flatMap{ radius -> doSearch(radius)}
.repeat()
.takeUntil(searchResponse.getItems().size >=5)
.map(anotherClass::displayOnMap)