2016-08-17 28 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列表,想要逐一上傳到服務器,等待每一個完成,繼續下一步,如果成功或失敗

+0

不認爲延遲將總arrDelay項目,它不應該這樣做。 – njzk2

+0

這個答案描述了一個操作符來執行你所要求的操作:http://stackoverflow.com/a/33633753/671543 – njzk2

+0

自從Observable.from(list)返回Observable 以來,第一個flatMap不應該是一個簡單的映射操作符?雖然我對RxJava沒有經驗 – GSala

回答

0

是的,你需要使用ConcatMap

平面地圖使用merge operator,而concatMap使用concat opertor

所以順序會是這樣

flatMap輸出序列爲merged
concatMap輸出序列ordered

在本answer

這裏描述的,你可以承擔這個例子來看看

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您可以同時檢查,因爲我們已經使用toList()

我知道我遲到給答案這個:)

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 
    } 

你可以得到更多的信息throught this blog post.