gpt4 book ai didi

java - RXJava2 : correct pattern to chain retrofit requests

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:17 26 4
gpt4 key购买 nike

总的来说,我对 RXJava 比较陌生(实际上只是开始将它与 RXJava2 一起使用),而且我能找到的大多数文档往往是 RXJava1;我现在通常可以在两者之间进行转换,但是整个 Reactive 的东西是如此之大,以至于它是一个具有良好文档的压倒性 API(当您可以找到它时)。我正在尝试简化我的代码,我想用一些小步骤来完成。我要解决的第一个问题是我在当前项目中经常使用的这种常见模式:

您有一个请求,如果成功,您将使用它来发出第二个请求。

如果其中任何一个失败,您需要能够识别出哪个失败了。 (主要用于显示自定义 UI 警报)。

这就是我现在通常做的:

(为简单起见省略了 .subscribeOn/observeOn)

Single<FirstResponse> first = retrofitService.getSomething();

first
.subscribeWith(
new DisposableSingleObserver<FirstResponse>() {
@Override
public void onSuccess(final FirstResponse firstResponse) {

// If FirstResponse is OK…
Single<SecondResponse> second =
retrofitService
.getSecondResponse(firstResponse.id) //value from 1st
.subscribeWith(
new DisposableSingleObserver<SecondResponse>() {

@Override
public void onSuccess(final SecondResponse secondResponse) {
// we're done with both!
}

@Override
public void onError(final Throwable error) {
//2nd request Failed,
}
});

}

@Override
public void onError(final Throwable error) {
//firstRequest Failed,
}
});

在 RXJava2 中有更好的方法来处理这个问题吗?

我已经尝试过 flatMap 和变体,甚至是 Single.zip 或类似的,但我不确定要处理的最简单和最常见的模式是什么这个。

如果您想知道 FirstRequest 将获取我在 SecondRequest 中需要的实际 Token。没有 token 无法发出第二个请求。

最佳答案

我建议使用平面 map (如果可以的话,还可以使用 retrolambda)。此外,如果您未对其进行任何操作,则无需保留返回值(例如 Single<FirstResponse> first)。

retrofitService.getSomething()
.flatMap(firstResponse -> retrofitService.getSecondResponse(firstResponse.id)
.subscribeWith(new DisposableSingleObserver<SecondResponse>() {
@Override
public void onSuccess(final SecondResponse secondResponse) {
// we're done with both!
}

@Override
public void onError(final Throwable error) {
// a request request Failed,
}
});

This这篇文章帮助我思考了如何构建 RxJava 的总体风格。如果可能,您希望您的链成为高级操作的列表,以便可以将其解读为一系列操作/转换。

编辑没有 lambda,你可以只使用 Func1为你的平面 map 。做同样的事情只是更多的样板代码。

retrofitService.getSomething()
.flatMap(new Func1<FirstResponse, Observable<SecondResponse> {
public void Observable<SecondResponse> call(FirstResponse firstResponse) {
return retrofitService.getSecondResponse(firstResponse.id)
}
})
.subscribeWith(new DisposableSingleObserver<SecondResponse>() {
@Override
public void onSuccess(final SecondResponse secondResponse) {
// we're done with both!
}

@Override
public void onError(final Throwable error) {
// a request request Failed,
}
});

关于java - RXJava2 : correct pattern to chain retrofit requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43355395/

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