一般而言,我对RXJava相对较新(实际上仅在RXJava2中才开始使用它),而且我能找到的大多数文档都倾向于RXJava1。我现在通常可以在两者之间进行翻译,但是整个Reactive的内容是如此之大,以至于它是一个压倒性的API,具有很好的文档(当您可以找到它时)。我正在尝试简化我的代码,这是我想做的简单的步骤。我要解决的第一个问题是我在当前项目中经常做的这种常见模式:

您有一个请求,如果成功,将用于发出第二个请求。

如果任何一个失败,则您需要能够确定哪个失败了。 (主要是显示自定义UI警报)。

这是我现在通常的做法:

(为简单起见,省略了.subscribeOn/observeOn)

Single<FirstResponse> first = retrofitService.getSomething();

first
   .subscribeWith(
     new DisposableSingleObserver<FirstResponse>() {
         @Override
         public void onSuccess(final FirstResponse firstResponse) {

               // If FirstResponse is OK…
                Single<SecondResponse> second =
                 retrofitService
                    .getSecondResponse(firstResponse.id) //value from 1st
                    .subscribeWith(
                      new DisposableSingleObserver<SecondResponse>() {

                           @Override
                           public void onSuccess(final SecondResponse secondResponse) {
                              // we're done with both!
                           }

                           @Override
                            public void onError(final Throwable error) {
                            //2nd request Failed,
                            }
                     });

         }

         @Override
         public void onError(final Throwable error) {
              //firstRequest Failed,
         }
      });

在RXJava2中,有没有更好的方法来解决这个问题?

我已经尝试过flatMap和它的变体,甚至是Single.zip或类似的东西,但是我不确定最简单,最常见的模式是什么。

如果您想知道FirstRequest是否会在SecondRequest中获取我需要的实际Token。没有 token ,无法再次发出请求。

最佳答案

我建议使用平面 map (如果可以的话,可以使用retrolambda)。
另外,如果您不对其进行任何操作,则无需保留返回值(例如Single<FirstResponse> first)。

retrofitService.getSomething()
    .flatMap(firstResponse -> retrofitService.getSecondResponse(firstResponse.id)
    .subscribeWith(new DisposableSingleObserver<SecondResponse>() {
         @Override
         public void onSuccess(final SecondResponse secondResponse) {
            // we're done with both!
         }

         @Override
          public void onError(final Throwable error) {
             // a request request Failed,
          }
   });

This文章帮助我全面思考了如何构造RxJava。如果可能的话,您希望您的链条是高级操作的列表,以便可以将其理解为一系列操作/转换。

编辑
如果没有lambda,则可以仅将Func1用于flatMap。做同样的事情只是增加了很多样板代码。
retrofitService.getSomething()
    .flatMap(new Func1<FirstResponse, Observable<SecondResponse> {
        public void Observable<SecondResponse> call(FirstResponse firstResponse) {
            return retrofitService.getSecondResponse(firstResponse.id)
        }
    })
    .subscribeWith(new DisposableSingleObserver<SecondResponse>() {
         @Override
         public void onSuccess(final SecondResponse secondResponse) {
            // we're done with both!
         }

         @Override
          public void onError(final Throwable error) {
             // a request request Failed,
          }
   });

关于java - RXJava2 : correct pattern to chain retrofit requests,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43355395/

10-10 00:53