2015-12-03 31 views
1

我有下面的一組RxJava符:我該如何擺脫一連串的RxJava電話?

currentUser = mApi.getUserById(userToken, userId, userId) 
        .onErrorReturn(throwable -> null) 
        .map(userSet -> userSet.getUsers().get(0)) 
        .doOnNext(user -> { 
         user.setToken(userToken); 
        }) 
        .toBlocking() 
        .first(); 

這裏的問題是,doOnNext()呼叫和呼叫map()可以上的空投入運行。我可以在每個這些調用了一個空的輸入檢查,並採取相應的行動,但我希望喜歡做的僅僅是打破業務鏈和價值null返回currentUser

這是可能的,如果我調整自己的RxJava操作不知何故?

回答

2

只是移動運營商onErrorReturn向鏈的末端,toBlocking()前。然後,在getUserById捕捉到的異常將通過下面的操作員的錯誤處理傳播(所以mapdoOnNext不會被執行),直到擊中onErrorReturn並返回NULL。

例如,該代碼打印null

Integer myInt = Observable.<Integer> error(new RuntimeException()) 
      .doOnNext(item -> System.out.println("doOnNextInvoked")) 
      .onErrorReturn(throwable -> null) 
      .toBlocking().first(); 

System.out.println(myInt); 

雖然這一個:

Integer myInt = Observable.<Integer> error(new RuntimeException()) 
      .onErrorReturn(throwable -> null) 
      .doOnNext(item -> System.out.println("doOnNextInvoked")) 
      .toBlocking().first(); 

System.out.println(myInt); 

打印

doOnNextInvoked 
null 

所以我們看到,doOnNext在第二種情況下被調用,但不是第一個。