繁体   English   中英

RxJava:链接可观察量

[英]RxJava: chaining observables

是否可以使用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
   })

我发现这个库非常有趣,但无法想象我们如何将请求链接到彼此依赖于之前的地方。

当然,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();
        }
    });

这是Googling 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和RxJava2的想法是一样的:

快速解释:

  • 我们尝试使用mDataManager.fetchQuotesFromApi()从api获取一些数据(在本例中为引号mDataManager.fetchQuotesFromApi()
  • 我们订阅了observable来在.io()线程上做东西并在.ui()线程上显示结果。
  • onErrorResumeNext()确保在此方法中捕获从获取数据中遇到的任何错误。 我想在那里出现错误时终止整个链,所以我返回一个Observable.error()
  • .flatmap()是链接部分。 我希望能够将从API获得的任何数据设置到我的数据库中。 我没有使用.map()转换我收到的数据,我只是在改变它的情况下使用该数据做其他事情
  • 我订阅了最后一个可观察链。 如果在获取数据时出现错误(第一个可观察的),则会使用onErrorResumeNext()处理它(在这种情况下,传播到订阅的onError() onErrorResumeNext()
  • 我非常清楚我正在订阅DB observable(在flatmap()内部)。 通过此observable发生的任何错误都不会传播到最后的subscribeBy()方法,因为它是在.flatmap()链内的subscribe()方法内处理的。

代码来自这个项目 ,位于: https//github.com/Obaied/Sohan/blob/master/app/src/main/java/com/obaied/dingerquotes/ui/start/StartPresenter.kt

尝试使用scan()

Flowable.fromArray(array).scan(...).subscribe(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM