2017-02-14 12 views
4

У меня есть сетевой вызов, который возвращает Observable, и у меня есть другой сетевой вызов, который не является rx, который зависит от первого Observable, и мне нужно как-то конвертировать все это с помощью Rx.Как вызвать сетевой вызов non-rx, который зависит от сетевого вызова rx

Observable<Response> responseObservable = apiclient.executeRequest(request); 

После выполнения мне нужно сделать еще один HTTP вызов, который не возвращает Observable:

responseObservable.map(response - > execute the no rx network call using the response.id) 

noRxClient.getInformation(response.id, new Action1<Information>() { 
    @Override 
    public void call(Information information) { 
     //Need to return information with page response 
    } 
}); 

После затем мне нужно вызвать этот метод, чтобы выводить ответ

renderResponse(response, information); 

Как могу ли я подключить не-rx-вызов с помощью rx, а затем вызвать ответ рендеринга с RxJava?

ответ

2

Вы можете обернуть асинхронные ноны-гх звонки в Observable с использованием Observable.fromEmitter (RxJava1) или Observable.create (RxJava2) и Observable.fromCallable (для не асинхронных звонков):

private Observable<Information> wrapGetInformation(String responseId) { 
    return Observable.create(emitter -> { 
     noRxClient.getInformation(responseId, new Action1<Information>() { 
      @Override 
      public void call(Information information) { 
       emitter.onNext(information); 
       emitter.onComplete(); 
       //also wrap exceptions into emitter.onError(Throwable) 
      } 
     }); 
    }); 
} 

private Observalbe<RenderedResponse> wrapRenderResponse(Response response, Information information) { 
    return Observable.fromCallable(() -> { 
     return renderResponse(response, information); 
     //exceptions automatically wrapped 
    }); 
} 

И объединяющих результатов использования overloaded flatMap оператора:

apiclient.executeRequest(request) 
    .flatMap(response -> wrapGetInformation(response.id), 
      (response, information) -> wrapRenderResponse(response, information)) 
    ) 
    //apply Schedulers 
    .subscribe(...) 
+0

Что произойдет, если wrapRenderResponse ничего не возвращает? он просто дает ответ. Как можно изменить этот код? –