2017-11-29 17 views
0

私は非反応コードをReactive Codeと橋渡しするシナリオを持っています。反復可能な終了からの終了成功した応答で観察可能

以下のシナリオを考えてください。

私はArrayListに3つのURLのリストを持っています。 ArrayListの中にある順に各URLに電話したいと思います。私は一度に1つのURLしか呼び出すことができません。最初のURLが応答を返す場合は、onComplete()に電話し、残りのURLを実行しないでください。ただし、応答がエラーの場合は、リスト内の次のURLを実行します。 私は、RxJavaが前のURLに対してエラー応答を受け取らない限り、flatMapを次のURLに呼び出さないようにします。 RxJavaの私の原始的な理解のため、私はこれを達成する方法を理解できませんでした。私はこのような何かを計画し何

Observable.fromIteratable(urlList) 
.subscribeOn(Schedulars.io()) 
.flatMap(new Func(String url, String data) { 
    SomeNetworkLibrary.getData(url) 
    .OnResponse(new NewResponse() { 
     public void onSuccess(String dataFromInternet) {return dataFromInternet;} 
     public void onError(String errorMessage) {return errorMessage;) 
    }) 
    // wait until we have response from the network call above and then return 
    // I don't know what will be the cleanest and efficient way of waiting here. 
}); 

TLDRを。

flatMap()からの結果が返される前にflatMap()を呼び出すことは望ましくありません。

どうすればいいですか?

答えて

0

あなたはObservableにネットワークAPI呼び出しをオンにして、平坦化した後take(1)を使用することができます。

Observable.fromIteratable(urlList) 
.subscribeOn(Schedulars.io()) 
.concatMapDelayError((String url, String data) -> { 
    return Observable.create(emitter -> { 
     SomeNetworkLibrary.getData(url) 
     .OnResponse(new NewResponse() { 
      public void onSuccess(String dataFromInternet) { 
       emitter.onNext(dataFromInternet); 
       // don't call emitter.onComplete() so that 
       // concatMapDelayError doesn't switch to the next source 
      } 
      public void onError(String errorMessage) { 
       emitter.onError(errorMessage); 
      } 
     ); 
    }); 
    // wait until we have response from the network call above and then return 
    // I don't know what will be the cleanest and efficient way of waiting here. 
}) 
.take(1); 
関連する問題