您可以使用flatMap()
運算符將列表轉換爲可觀察條目。使用zipWith()
運算符將每個列表條目與單個列表中數據包的索引配對。 flatMap()
再次發送並獲得結果狀態。將一個NOK
變成一個throwable,並終止內部觀察鏈。在使用flatMap()
運算符時,添加最終參數1
會使映射一次發生,因此在此觀察鏈中沒有請求重疊。
packetsSubject
.flatMap(listOfPackets -> Observable.from(listOfPackets)
.zipWith(Observable.range(1, LARGE_NUMBER), (p, i) -> new Pair<>(p, i))
.flatMap(pair -> transmits(pair.getFirst())
.flatMap(status -> status.equals("OK")
? Observable.empty()
: Observable.error(new IllegalStateException()))
.doOnError(error -> System.out.println("Error at index " + pair.getSecond()))
.onErrorResumeNext(Observable.empty()), 1))
.subscribe();
雖然我對NOK
映射到錯誤,記錄它,然後重新映射結果返回的最後步驟,內部不舒服,有它的一個原因。 listOfPackets
的處理必須在處理完所有數據包或看到Status.NOK
時終止;將Status.NOK
轉換爲錯誤指示符即可完成此操作。但是,我們只希望單個列表的處理終止,而不是整個可觀察的。
您是否嘗試使用'concat'運算符?對於錯誤處理,新列表是否與舊列表有任何關係? – masp
這兩個列表沒有任何共同之處,我通過切分請求負載來獲取數據包列表。 concat操作符如何適合圖片? – n1r3
我認爲'concat'的請求發生的順序與列表中的順序相同。如果一個失敗,那麼你不會嘗試下一個項目。 – masp