gpt4 book ai didi

android - RXJava Android - 创建另一个可观察对象所需的可观察结果

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:01 24 4
gpt4 key购买 nike

我找不到一种方法来组合或链接一系列可观察对象,它的响应是创建另一个可观察对象的其他调用的先决条件。

我正在对可观察对象进行改造。

我的服务:

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

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

另一个服务需要那个 GeocodeResult

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

    //先决条件 1Observable geocodeObservable = Address.get(...);

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

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

使用 JoinObservable:

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

但它会抛出一个 NoSuchElementException 异常。为什么?

我愿意toBlocking().single()因为我需要 Observable 而不是 Observable<Observable<Order>> :(.

或者我该怎么做?

最佳答案

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

该函数获取第一个可观察对象发出的项目,并为每个项目创建一个可观察对象,然后将这些可观察对象发出的项目扁平化为单个可观察对象。这听起来很复杂,但幸运的是,您的两个 Retrofit 函数都只发出一个项目,因此只有一个可观察对象被“扁平化”为可观察对象。

你可以像这样使用flatMap:

restApi.getReverse(gMapsKey, origin)
.flatMap(geocodeResult -> createOrder(geocodeResult))
.subscribe(order -> doSomething(order));

combineLatest 并不能真正满足您的需求,因为它会同时执行两个 REST 调用,而不是一个接一个地执行,因此您不能将第一个的响应用作第二个参数。我无法评论为什么会为 JoinObservable 抛出异常,因为它不是任何公共(public) API 的一部分。此外,toBlocking() 不应真正用于测试以外的任何用途。

关于android - RXJava Android - 创建另一个可观察对象所需的可观察结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com