【问题标题】:RxJava two request in sequenceRxJava 依次请求两个请求
【发布时间】:2017-04-27 16:31:27
【问题描述】:

我有两个请求,第二个它依赖于第一个所以,如何按顺序进行,因为如果并行请求,有一些检查会收到 null

        Observable<Map<Integer, SupportedVersion>> supportedVersionObservable = contentAPI
            .getSupportedVersionsContent()
            .compose(ReactiveUtils.applySchedulers())
            .map(supportedVersionsContentContentContainer -> supportedVersionsContentContentContainer.getContent().get(0).getMessage())
            .doOnNext(supportedVersionsMap -> {
                Timber.i("doOnNext invoked from supported version observable");
                for (Map.Entry<Integer,SupportedVersion> entry : supportedVersionsMap.entrySet())
                    if (Build.VERSION.SDK_INT >= entry.getKey())
                        model.setSupportedVersion(entry.getValue());

                model.setCurrentVersionExpiryDate(model.getSupportedVersion().getCurrentVersionExpiryDate());

                if (model.getSupportedVersion() != null)
                    model.setNewFeaturesSeen(sharedPreferencesManager.isNewFeaturesSeen(model.getSupportedVersion().getAvailableVersions().get(0)));
                if (model.isNewFeaturesSeen());
                //request data from here 
            })
            .retry(1);

    Observable<List<WhatsNew>> getWhatsNewFeature = contentAPI
            .getWhatsNewFeature(model.getSupportedVersion().getAvailableVersions().get(0))
            .compose(ReactiveUtils.applySchedulers())
            .doOnNext(whatsNewList -> {
                Timber.i("doOnNext invoked from supported version observable");
                if (!whatsNewList.isEmpty())
                    model.setWhatsNews(whatsNewList);
            })
            .retry(1);

【问题讨论】:

    标签: java android rx-java system.reactive rx-android


    【解决方案1】:

    您可以为此使用 flatMap:

    public Observable<List<WhatsNew>> makeRequest { 
       return contentAPI
            .getSupportedVersionsContent()
            .flatMap(supportedVersionsMap -> {
                 //... model initialization
                 return contentAPI
                        .getWhatsNewFeature(model.getSupportedVersion().getAvailableVersions().get(0))
                        .compose(ReactiveUtils.applySchedulers())
                        .doOnNext(whatsNewList -> {
                        Timber.i("doOnNext invoked from supported version observable");
                        if (!whatsNewList.isEmpty())
                            model.setWhatsNews(whatsNewList);
                        })
                       .retry(1);
            });
    

    【讨论】:

      【解决方案2】:

      您不需要副作用。您可以在运算符中保存模型状态:

      @Test
      void name() {
          ContentApi mock = mock(ContentApi.class);
      
          Observable<Model> modelObservable = mock.getSupportedVersionsContent()
                  .map(s -> {
                      // do Mapping
                      return new Model();
                  })
                  .flatMap(model -> mock.getWhatsNewFeature(model)
                          .map(whatsNews -> {
                              // Create new model with whatsNews
                              return new Model();
                          }), 1);
      }
      
      interface ContentApi {
          Observable<String> getSupportedVersionsContent();
      
          Observable<List<WhatsNew>> getWhatsNewFeature(Model model);
      }
      
      class Model {
      
      }
      
      class WhatsNew {
      
      }
      

      请查看flatMap的详细说明:

      http://tomstechnicalblog.blogspot.de/2015/11/rxjava-operators-flatmap.html?m=0

      【讨论】:

        猜你喜欢
        • 2018-05-31
        • 1970-01-01
        • 2021-11-25
        • 2020-01-29
        • 2020-03-28
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多