我正在尝试在 Android 上使用 rx-java 来执行几个连续的 http 请求,每个请求都依赖于前一个的响应。这不太适合 map() / doFinall() 模型,所以我不确定在不进入“回调地狱”以及编写简洁代码的情况下最好的方法是什么。
更具体地说:
- 做 http GET "/x"
- 如果 (2) 成功,则执行 http GET "/y"
- 对 GET /y 的结果进行计算
关于如何解决这个问题的任何建议?
我认为 flatMap 是您正在寻找的。例如,假设您有以下方法:
Observable<Foo> getFoo();
Observable<Bar> getBar(Foo foo); //needs a Foo first
您可以通过这种方式有效地链接它们:
getFoo().flatMap(new Func1<Foo, Observable<Bar>>() {
@Override
public Observable<Bar> call(Foo foo) {
return getBar(foo);
}
});
然后,您可以通过订阅结果对最终结果 Bar 执行一些计算Observable<Bar>
(为清楚起见显示了完整示例):
getFoo().flatMap(new Func1<Foo, Observable<Bar>>() {
@Override
public Observable<Bar> call(Foo foo) {
return getBar(foo);
}
}).subscribe(new Action1<Bar>() {
@Override
public void call(Bar bar) {
//everything succeeded, so perform calculation to the Bar
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
//handle an error that occurred anywhere in the chain
}
});
请注意,获取 Foo 或 Bar 过程中的任何错误都将由我们在订阅 Observable 时提供的 Action1 处理。当然,因为 Java,它非常冗长,但至少它避免了嵌套 Observables/回调地狱。