2016-08-17 5 views
0

私はいくつかの値を抽出し、アイテムごとにAPI呼び出しを行う必要がある項目のリストを持っています。すべての呼び出しが並行して行われている理由の問題があるので、私はthis_android RxJava Observable.fromからサービスに投稿する

Observable.from(myList) 
    .flatMap{ item -> 
     return serviceInteractor.uploadToServer(item) 
    } 
    .map { serverResponse -> 
     return serverResponse.getResponseCode 
    } 
    .toList() 
    .subscrible{ responseList -> 
    // do something with all the responses 
    } 

オクラホマのようなものを使っていることを行うために、私は知りません。 最初の応答を待ち、結果をマップし、Observable.from()の次の項目に進み、最後にresponseMessagesの最終リストを返しますか?起こっていることは、すべてが同時に起こることです。これを確認するには、toListメソッドの前に遅延(1、TimeUnit.Seconds)を入れると、すべてが同時に発生し、最後のonNextだけが遅延します。

どうすればいいですか? IDのリストを持っていて、1つずつサーバにアップロードし、それぞれが完了するのを待って、成功または失敗した場合は次へ進みます。

+0

なしに答えを与えるために遅れる知っ

toList()を使用しているように、その遅延がarrDelay項目の合計となりますチェックすることができ、それを行うことになっていません。 – njzk2

+0

この回答は、あなたが尋ねたことを行う演算子を記述しています:http://stackoverflow.com/a/33633753/671543 – njzk2

+0

Observable.from(list)がObservable を既に返すので、最初のflatMapを単純なマップ演算子にするべきではありません?私はRxJavaに経験はありません – GSala

答えて

0

throughtより多くの情報を得ることができますはいあなたはConcatMap

を使用する必要があります

フラットマップはmerge operatorを使用し、concatMapはconcat opertorを使用します。

ここでこのanswer

で説明したように、この例に見てみることができますordered

ので、シーケンスがある。この

flatMap出力シーケンスのようになりますmerged
concatMap出力配列である

String arrData[] = {"0", "1", "2", "3", "4"}; 
Integer arrDelay[] = {1000, 6000, 4000, 9000, 2000}; 

Observable.from(arrData) 
      .concatMap(s -> Observable.from(arrData) 
         .delay(arrDelay[Integer.parseInt(s)],TimeUnit.MILLISECONDS)) 

      .map(integer -> integer) 
      .toList() 
      .doOnCompleted(() -> Log.v("log", "doOnCompleted")) 
      .subscribe(integer -> Log.v("log", "" + integer)); 

ここy OUは、私たちが、私はこの:)

1

flatMapは呼び出しをスタックします。 Observableのそれぞれに加入し、到着順に結果を送信します。結果はではなく、となります(documentation参照)。

あなたは結果が順序付けられていることを望んでいるならば、あなたはconcatMap演算子をご覧ください。(documentationを参照)

Observable.from(myList) 
    .concatMap{ item -> 
       return serviceInteractor.uploadToServer(item) 
     } 
    .map { serverResponse -> 
     return serverResponse.getResponseCode 
     } 
    .toList() 
    .subscrible{ responseList -> 
     // do something with all the responses 
    } 

あなたはthis blog post.

関連する問題