是否可以使用RxJava实现下一个链接:
loginObservable()
.then( (someData) -> {
// returns another Observable<T> with some long operation
return fetchUserDataObservable(someData);
}).then( (userData) -> {
// it should be called when fetching user data completed (with userData of type T)
cacheUserData(userData);
}).then( (userData) -> {
// it should be called after all previous operations completed
displayUserData()
}).doOnError( (error) -> {
//do something
})
我发现这个图书馆非常有趣,但无法确定如何将请求链接到彼此取决于之前的位置。
答案 0 :(得分:41)
当然,RxJava支持.map
这样做。来自RxJava Wiki:
基本上,它是:
loginObservable()
.switchMap( someData -> fetchUserDataObservable(someData) )
.map( userData -> cacheUserData(userData) )
.subscribe(new Subscriber<YourResult>() {
@Override
public void onCompleted() {
// observable stream has ended - no more logins possible
}
@Override
public void onError(Throwable e) {
// do something
}
@Override
public void onNext(YourType yourType) {
displayUserData();
}
});
答案 1 :(得分:7)
这是Google搜索 RxJava链可观察量时的首要帖子,所以我只是添加另一个常见的情况,你不想转换你收到的数据,但是用另一个动作链接它(例如,将数据设置到数据库)。使用.flatmap()
。这是一个例子
mDataManager.fetchQuotesFromApi(limit)
.subscribeOn(mSchedulerProvider.io())
.observeOn(mSchedulerProvider.ui())
.onErrorResumeNext(Function { Observable.error<List<Quote>>(it) }) //OnErrorResumeNext and Observable.error() would propagate the error to the next level. So, whatever error occurs here, would get passed to onError() on the UI side
.flatMap { t: List<Quote> ->
//Chain observable as such
mDataManager.setQuotesToDb(t).subscribe({}, { e { "setQuotesToDb() error occurred: ${it.localizedMessage}" } }, { d { "Done server set" } })
Observable.just(t)
}
.subscribeBy(
onNext = {},
onError = { mvpView?.showError("No internet connection") },
onComplete = { d { "onComplete(): done with fetching quotes from api" } }
)
这是RxKotlin2,但是这个想法和RxJava&amp; RxJava2:
mDataManager.fetchQuotesFromApi()
.io()
线程上执行操作并在.ui()
线程上显示结果。onErrorResumeNext()
确保在此方法中捕获从获取数据中遇到的任何错误。我想在那里出现错误时终止整个链,所以我返回Observable.error()
.flatmap()
是链接部分。我希望能够将从API获得的任何数据设置到我的数据库中。我没有使用.map()
转换我收到的数据,我只是使用 进行其他 onError()
onErrorResumeNext()
)
flatmap()
内)。通过此可观察对象发生的任何错误都会 NOT 传播到最后的subscribeBy()
方法,因为它是在subscribe()
链中的.flatmap()
方法内处理的。 / LI>
代码来自this project,位于此处:https://github.com/Obaied/Sohan/blob/master/app/src/main/java/com/obaied/dingerquotes/ui/start/StartPresenter.kt
答案 2 :(得分:0)
尝试使用scan()
Flowable.fromArray(array).scan(...).subscribe(...)