2016-02-11 32 views
2

我有問題。有沒有像RxJava中的Promise.all()方法?

我需要通過項目id的列表來獲取一些項目的列表。 起初,我試圖

Observable.from(itemIds) 
    .flatMap(itemId -> requestToServer(itemId)) 
    .subscribe(item -> { /* do something */ }); 

但運營商flatMap並不能保證項目的順序。 我需要得到的項目爲ItemIds

如果有像Promise.all()這樣的api,那將會很棒。 RxJava中有沒有類似Promise.all()的方法?或者其他方式?

回答

0

改爲使用concatMap。這將串連爲了發出觀測量,而不是合併它們的排放

返回一個新的可觀察到發射從應用 功能導致你提供給由源 觀察的,如該函數返回一個發出的每一個項目的項目可觀察的,然後發射由結果得到的結果產生的項目 可觀測量。

+0

是的,但是'concatMap'處理請求一個一個。 我想要做的是所有的請求都是併發的,但是所有的響應都是按順序的。作爲'Promise.all()'做。 – chooblarin

+0

也許這篇文章會有幫助嗎?雖然沒有嘗試過這個技巧,但是''concatMap',所以不確定:http://tomstechnicalblog.blogspot.com/2015/11/rxjava-achieving-parallelization.html –

+0

我找到'concatMapEager'運算符。也許,這是我需要的。謝謝! – chooblarin

4

這聽起來像你正在尋找的Zip operator

例如:

Observable<Integer> obs1 = Observable.just(1); 
Observable<String> obs2 = Observable.just("Blah"); 
Observable<Boolean> obs3 = Observable.just(true); 

Observable.zip(obs1, obs2, obs3, (Integer i, String s, Boolean b) -> i + " " + s + " " + b) 
.subscribe(str -> System.out.println(str)); 

打印:

1 Blah true

相關問題