第一个API调用返回一个元素列表,然后我想随后调用另一个API,在第一个API调用的列表的每个元素中返回一个String
。我(想我)已经得到了它,所以它用列表的每个元素调用第二个应用编程接口调用,但是我不确定如何订阅它来获得第二个调用返回的结果。
discogsService.getSearchResults(searchTerm, mContext.getString(R.string.token))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
// Turns the result into individual elements
.flatMapIterable(RootSearchResponse::getSearchResults)
// I believe this then calls .getRelease() with each ID string
.map(result -> discogsService.getRelease(result.getId()));
改装接口:
public interface DiscogsService
{
@GET("database/search?")
Observable<RootSearchResponse> getSearchResults(@Query("q") String searchTerm, @Query("token") String token);
@GET("releases/")
Observable<Release> getRelease(@Query("release_id") String releaseId);
}
我不确定从这里去哪里。
我相信。订阅(…)
然后使我能够获得可观察的
有没有一种方法可以让我直接从模型层返回每个可观察的对象,这样我就不需要有两个单独的
。订阅(…)
s?或者我应该使用两个单独的
。订阅(…)
s,因为我可以捕获它们两个上的错误?我只想要第二次通话的结果。
以下是我尝试过的完整代码:
在模型中:
discogsService.getSearchResults(searchTerm, mContext.getString(R.string.token))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.flatMapIterable(RootSearchResponse::getSearchResults)
.subscribeOn(Schedulers.io())
.map(result -> discogsService.getRelease(result.getId()))
.subscribe(new Observer<Observable<Release>>()
{
@Override
public void onSubscribe(Disposable d)
{
}
@Override
public void onNext(Observable<Release> value)
{
mainPresenter.addToRecyclerView(value);
}
@Override
public void onError(Throwable e)
{
}
@Override
public void onComplete()
{
}
});
在演示者:
@Override
public void addToRecyclerView(Observable<Release> value)
{
value .observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Observer<Release>()
{
@Override
public void onSubscribe(Disposable d)
{
}
@Override
public void onNext(Release value)
{
Log.e(TAG, "Success! " + value);
results.add(value);
}
@Override
public void onError(Throwable e)
{
Log.e(TAG, "Error: " + e.toString());
Log.e(TAG, "Error: " + e.toString());
}
@Override
public void onComplete()
{
}
});
我宁愿公开一个可见的
Observable<Release> getReleases(...) {
return discogsService.getSearchResults(...)
.flatMapIterable(RootSearchResponse::getSearchResults)
.flatMap(result -> discogsService.getRelease(result.getId()));
}
演讲者只会订阅它:
getReleases
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Observer<Release>()
{
@Override
public void onSubscribe(Disposable d)
{
}
@Override
public void onNext(Release value)
{
Log.e(TAG, "Success! " + value);
results.add(value);
}
@Override
public void onError(Throwable e)
{
Log.e(TAG, "Error: " + e.toString());
Log.e(TAG, "Error: " + e.toString());
}
@Override
public void onComplete()
{
}
});
只有一个可以观察到。注意,对于
getReleases(…)中的第二个请求,从
map()
切换到flatMap()
。在幕后,这是发生第二次订阅的地方。
最终订阅将接收来自两个请求的错误。我更喜欢让消费者(演示者)处理错误,因为他们关心响应,知道在出现错误时该怎么做(例如显示消息)。
这是一个谁'驱动'观察,谁创造,处置它,所以这也是他的职责分配线程imho。
从一层暴露到另一层,可观察性非常好。它描述了数据类型、如何使用它以及模式(可观察?单一?流动?)。
球门 在我的应用程序中,我希望使用改装2上传一些文件到我的网络服务器(一次多个,在这种情况下是图片。)到那个特定的文件。 尝试 我对使用函数式编程范式不熟悉,所以我的理解可能会被误导。我有两个不同的对象,一个文件响应(DTO表示从我的网络服务器上传文件后的响应)和一个照片对象。这个Photo对象有两个字段,并充当在我的后端服务器中持久化的实体。它的字段对应于列,并且单独上传这些对象可以很好地工作。
问题内容: 一般而言,我对RXJava相对较新(真的只是开始将其与RXJava2一起使用),而且我能找到的大多数文档都倾向于RXJava1。我现在通常可以在两者之间进行翻译,但是整个Reactive的内容是如此之大,以至于它是一个压倒性的API,具有很好的文档(当您可以找到它时)。我正在尝试简化我的代码,这是我想用婴儿的脚步做到的。我要解决的第一个问题是我在当前项目中做的很多工作: 您有一个请求,
问题内容: 我有两个完成。我想做以下情形:如果第一个Completable到达onComplete,则继续第二个Completable。最终结果将是第二完成的onComplete。 当我有单个 getUserIdAlreadySavedInDevice() 和Completable login() 时,这就是我的方法: 问题答案: 您正在寻找运营商。 返回一个Completable,它首先运行此C
问题内容: 我正在寻找一种可以链接多个HTTP请求的良好模式。我想使用Swift,最好使用Alamofire。 举例来说,我要执行以下操作: 发出PUT请求 发出GET请求 用数据重新加载表 承诺的概念似乎很适合此目的。如果我可以执行以下操作,则PromiseKit可能是一个不错的选择: 但这是不可能的,或者至少我不知道。 如何在不嵌套多个方法的情况下实现此功能? 我是iOS的新手,所以也许我缺少
我正在尝试从使用普通改型迁移到使用RxJava扩展进行改型,以便在后台线程上进行API调用链。 例如,我有一个名为ModelGroup的对象,它有一个ModelPerson对象列表。我的目标是做到以下几点。 将ModelGroup发送到服务器并接收一个响应,它是一个整数,表示新插入的ID,我们称之为newGroupId 对于ModelGroup中的每个ModelPerson,设置Person。gr
问题内容: 我需要链接来自Google Maps API的一些API请求,而我正在尝试使用Axios来实现。 这是第一个请求,它在componentWillMount()中 这是第二个请求: 然后,我们有第三个请求,这取决于前两个请求是否完成: 如何链接这三个电话,以便第三个电话发生在前两个电话之后? 问题答案: 首先,不确定是否要在其中执行此操作,最好将其插入并具有一些默认状态,这些状态一旦完成