RxJava:链接可观察量

时间:2014-11-14 17:41:55

标签: 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
   })

我发现这个图书馆非常有趣,但无法确定如何将请求链接到彼此取决于之前的位置。

3 个答案:

答案 0 :(得分:41)

当然,RxJava支持.map这样做。来自RxJava Wiki:

map

基本上,它是:

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()
  • 的api中获取一些数据(本例中为引号)
  • 我们订阅了observable以在.io()线程上执行操作并在.ui()线程上显示结果。
  • onErrorResumeNext()确保在此方法中捕获从获取数据中遇到的任何错误。我想在那里出现错误时终止整个链,所以我返回Observable.error()
  • .flatmap()是链接部分。我希望能够将从API获得的任何数据设置到我的数据库中。我没有使用.map()转换我收到的数据,我只是使用 进行其他
  • 我订阅了最后一个可观察链。如果在获取数据时出现错误(第一个可观察的),则会使用onError()
  • 处理(在这种情况下,传播到订阅的onErrorResumeNext()
  • 我非常清楚我正在订阅DB observable(在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(...)