RXJava Android - 需要创建另一个observable的可观察结果

Dan*_*ico 3 android reactive-programming observable rx-java

我找不到一种方法来组合或链接一个observable列表,它的响应是创建另一个Observable的其他调用的先决条件.

我正在使用observable进行改造.

我的服务:

String url = "/geocode/json?sensor=false";

@GET(url)
Observable<GeocodeResult> getReverse(@Query("key") String gMapsKey,
                                     @Query("latlng") LatLng origin);
Run Code Online (Sandbox Code Playgroud)

而另一项服务需要GeocodeResult

@POST("/api/orders")
Observable<Order> createOrder(@Body GeocodeResult newOrder);
Run Code Online (Sandbox Code Playgroud)
  1. 我正在尝试:

    //前提条件1 Observable geocodeObservable = Address.get(...);

    //获取地理编码后调用createOrder?返回Observable.combineLatest(geocodeObservable,geocode - > createOrder(geocode));

但是它不起作用因为combineLatest需要一个对象,而不是一个可观察但我需要返回observable.

使用JoinObservable:

Pattern5<Geocode> pattern = JoinObservable.from(geocodeObservable)
Plan0<Observable<Order>> plan = pattern.then(Order::create);
return JoinObservable.when(plan).toObservable().toBlocking().single();
Run Code Online (Sandbox Code Playgroud)

但它会抛出NoSuchElementException异常.为什么?

我这样做toBlocking().single()是因为我需要Observable而不是Observable<Observable<Order>>:(.

或者我该怎么办?

Luk*_*iko 6

您可以尝试使用flatMap,它可以将第二个observable作为参数.

该函数接受第一个observable发出的项,并为每个项创建一个observable,然后将这些observable发出的项展平为单个observable.这听起来很复杂,但幸运的是,你的Retrofit函数只发出一个项目,所以只有一个observable被"展平"成一个observable.

你可以flatMap像这样使用:

restApi.getReverse(gMapsKey, origin)
    .flatMap(geocodeResult -> createOrder(geocodeResult))
    .subscribe(order -> doSomething(order));
Run Code Online (Sandbox Code Playgroud)

combineLatest并不真正符合您的需求,因为它会同时执行两个REST调用,而不是一个接一个地执行,因此您不能使用第一个的响应作为第二个的参数.我不能评论为什么抛出异常,JoinObservable因为它不是任何公共API的一部分.也toBlocking()真的不应该被用于除测试其他任何东西.