2017-10-09 41 views
0

我試圖找到一種並行執行請求的方法,並在每個observable完成時處理它們。儘管所有的觀察對象都給出了迴應,但所有事情都能正常工作,但在完成所有事情時我沒有辦法處理所有的錯誤。RxAndroid - 使用Zip操作符處理錯誤

這是拉鍊運算符,它基本上並行地執行2名的請求的示例:

Observable.zip(
       getObservable1() 
         .onErrorResumeNext { errorThrowable: Throwable -> 
          Observable.error(ErrorEntity(Type.ONE, errorThrowable)) 
         }.subscribeOn(Schedulers.io()), 
       getObservable2() 
         .onErrorResumeNext { errorThrowable: Throwable -> 
          Observable.error(ErrorEntity(Type.TWO, errorThrowable)) 
         }.subscribeOn(Schedulers.io()), 
       BiFunction { value1: String, value2: String -> 
        [email protected] value1 + value2 
       }) 
       //execute requests should be on io() thread 
       .subscribeOn(Schedulers.io()) 
       //there are other tasks inside subscriber that need io() thread 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(
         { result -> 
          Snackbar.make(view, "Replace with your own action " + result, Snackbar.LENGTH_LONG) 
            .setAction("Action", null).show() 
         }, 
         { error -> 
          Log.d("TAG", "Error is : " + (error as ErrorEntity).error.message) 
         } 
       ) 


private fun getObservable1(): Observable<String> { 
    return Observable.defer { 
     throw Throwable("Error 1") 
    } 
} 

private fun getObservable2(): Observable<String> { 
    return Observable.defer { 
     throw Throwable("Error 2") 
    } 
} 

問題的這種方法是,沒有機制來加入用於成功的情況下等雙功能每個錯誤做。因此,zip運算符只會觸發第一個錯誤,並會忽略其他錯誤。

輸出:

D/TAG: Error is : Error 1 

有什麼辦法來檢索所有的錯誤後,才觀察到的每一個拉鍊內完成或放棄錯誤?

我的主要目標是查看哪些請求發生了錯誤,並僅在用戶出現對話框時詢問他是否要重試失敗的請求。

+0

如果你沒有繼續在下一個簡歷上發生錯誤,而是使用一個包含錯誤的包裝器對象,這可能會更容易? – masp

+0

這是一個可能的解決方案,謝謝。然而,它並沒有打破onError()onNext()方法的目的? – iGoDa

+2

'有onError()onNext()方法的目的?'這取決於您在系統中定義爲「錯誤」的內容。我同意這篇文章@LordRaydenMK的提及和[這一個](http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/)。如果您的應用/系統不知道如何處理,應該使用「OnError」。每當系統不遵循「快樂之路」時,您不應該拋出異常。 – masp

回答

1

您可以使用數據類爲您的觀測值建模。例如。

sealed class Response { 
    data class Success(val data: String) : Response() 
    data class Error(val t: Throwable) : Response() 
} 

,那麼你可以將觀測映射到這樣的迴應:

val first: Observable<Response> = observable1 
     .map<Response> { Response.Success(it) } 
     .onErrorReturn { Response.Error(it) } 

val second: Observable<Response> = observable2 
     .map<Response> { Response.Success(it) } 
     .onErrorReturn { Response.Error(it) } 

,你可以將它們組合起來:

Observable.zip(
     first, 
     second, 
     BiFunction { t1: Response, t2: Response -> Pair(t1, t2) } 
).subscribe({println(it)}) 

此打印:

(錯誤( t = java.lang.Exception:錯誤1),錯誤(t = java.lang.Exception: 錯誤2))

this article此外看一看。