2

Android で rx-java を使用して、いくつかの連続した http 要求を実行しようとしていますが、それぞれが前者の応答に依存しています。これは map() / doFinall() モデルに完全には適合しないため、「コールバック地獄」に陥ったり、簡潔なコードを記述したりせずにこれを行うための最良の方法が何であるかはわかりません。

より具体的には:

  1. http GET "/x" を実行します
  2. (2)が成功した場合は http GET "/y" を実行
  3. GET /y の結果を計算する

これをどうするかについての提案はありますか?

4

1 に答える 1

4

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);
    }
});

次に、結果をサブスクライブすることにより、最終結果バーでいくつかの計算を実行できます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/callback 地獄のネストを回避します。

于 2014-01-24T08:33:28.073 に答える