所以,我有一个/download
API,它返回一个通用Object
(基于索引号,这是它自己的参数)然后我必须将它保存到我的数据库,如果事务是成功之后,我必须增加索引并再次重复相同的过程,否则retry()
。
我需要重复约50次。
如何使用Rx-Java实现此过程? 我现在卡住了。任何帮助都是极好的。谢谢。
答案 0 :(得分:5)
Observable.range(1, 50)
.flatMap(index -> // for every index make new request
makeRequest(index) // this shall return Observable<Response>
.retry(N) // on error => retry this request N times
)
.subscribe(response -> saveToDb(response));
回答评论(仅在先前的响应保存到db后才发出新请求):
Observable.range(1, 50)
.flatMap(index -> // for every index make new request
makeRequest(index) // this shall return Observable<Response>
.retry(N) // on error => retry this request N times
.map(response -> saveToDb(response)), // save and report success
1 // limit concurrency to single request-save
)
.subscribe();
答案 1 :(得分:1)
如果我理解正确,这段代码应指向正确的方向。
BehaviorSubject<Integer> indexes = BehaviorSubject.createDefault(0);
indexes.flatMap(integer -> Observable.just(integer)) // download operation
.flatMap(downloadedObject -> Observable.just(integer)) // save operation
.doOnNext(ind -> indexes.onNext(ind + 1))
.subscribe(ind -> System.out.println("Index " + ind));
会发生什么:
请记住在onNext
中添加停止条件,以便最终无限循环。
答案 2 :(得分:0)
我需要重复这个约50次。
您可以使用range
运算符并处理每个发出的Int。
如果交易成功,我必须增加我的索引
在这种情况下,您需要使用concatMap
运算符。它按顺序处理每个Observable
。
Observable<Response> makeRequest(int i) {...}
Completable saveToDb(Response response) {...}
Observable.range(1, 50)
.concatMap(i -> makeRequest(i)
//I assume that you save your response to DB asynchronously
//if not - use doOnNext operator instead of flatMapCompletable
.flatMapCompletable(response -> saveToDb(response)
.toObservable())
.retry()
...