Mik*_*ail 43 java android scala promise rx-java
是否可以使用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
})
Run Code Online (Sandbox Code Playgroud)
我发现这个库非常有趣,但无法想象我们如何将请求链接到彼此依赖于之前的地方.
Ben*_*aum 43
当然,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();
}
});
Run Code Online (Sandbox Code Playgroud)
这是Googling RxJava链可观察量的最高职位,因此我将添加另一个常见情况,您不希望转换您收到的数据,但将其与另一个操作链接(例如,将数据设置为数据库).使用.flatmap().这是一个例子
mDataManager
.fetchQuotesFromApi(limit)
.subscribeOn(mSchedulerProvider.io())
.observeOn(mSchedulerProvider.ui())
// 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.
.onErrorResumeNext(Function { Observable.error<List<Quote>>(it) })
.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" } }
)
Run Code Online (Sandbox Code Playgroud)
这是RxKotlin2,但RxJava和RxJava2的想法是一样的:
mDataManager.fetchQuotesFromApi().io()线程上做东西并在线程上显示结果.ui().onErrorResumeNext()确保在此方法中捕获我们在获取数据时遇到的任何错误.我想在那里出现错误时终止整个链,所以我回复了Observable.error().flatmap()是链接部分.我希望能够将从API获得的任何数据设置到我的数据库中.我没有改变我收到的数据.map(),我只是在不改变它的情况下使用该数据做其他事情.onError())onErrorResumeNext()flatmap()).通过此observable发生的任何错误都不会传播到最后的subscribeBy()方法,因为它是subscribe()在.flatmap()链内的方法内处理的.代码来自这个项目,位于:https://github.com/Obaied/Sohan/blob/master/app/src/main/java/com/obaied/dingerquotes/ui/start/StartPresenter.kt