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 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>>:(.
或者我该怎么办?
您可以尝试使用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()真的不应该被用于除测试其他任何东西.
| 归档时间: |
|
| 查看次数: |
1392 次 |
| 最近记录: |