2015-09-02 4 views
13

मैं इन इकाई परीक्षण किए गए, और परिणाम नहीं है कि मैं क्या सब से अधिक अपेक्षित:RxJava doOnError और ऑनररेटर्न कैसे काम करता है?

// This one outputs "subscribe.onError" 
@Test 
public void observable_doOnError_subscribingToError() throws InterruptedException { 
    Observable<String> obs = getErrorProducingObservable(); 
    obs.doOnError(throwable -> System.out.println("doOnError")); 
    obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
     s -> {}, 
     error -> System.out.println("subscribe.onError") 
    ); 
    Thread.sleep(300); 
} 

// This one outputs "subscribe.onError" 
@Test 
public void observable_onErrorReturn() throws InterruptedException { 
    Observable<String> obs = getErrorProducingObservable(); 
    obs.onErrorReturn(throwable -> "Yeah I got this"); 
    obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
     s -> System.out.println("got: " + s), 
     error -> System.out.println("subscribe.onError") 
    ); 
    Thread.sleep(300); 
} 

private Observable<String> getErrorProducingObservable() { 
    return Observable.create(subscriber -> { 
     subscriber.onError(new RuntimeException("Somebody set up us the bomb")); 
    }); 
} 

तो दोनों उत्पादन "subscribe.onError" - न doOnError है और न ही onErrorReturn कहा जा रहा है।

स्रोत प्रत्यक्ष संशोधित इतना है कि यह एक कार्रवाई का आह्वान करता है, तो यह onError कॉल: के रूप में

doOnError प्रलेखित है।

मुझे यकीन है कि को समझ करने के लिए कैसे नहीं हूँ, लेकिन मैं उत्पादन या "doOnError" "subscribe.onError" के बाद होने की उम्मीद या तो "doOnError"।

एक नमूदार एक आइटम (एक निर्दिष्ट समारोह से लौट आए) के बजाय onError लागू करता है, तो यह एक त्रुटि का सामना करना पड़ता से फेंकना निर्देश देता है: के रूप में

onErrorReturn प्रलेखित है।

इसलिए मुझे उम्मीद थी कि "मिला: हाँ मुझे यह मिला" बाद के परीक्षण से आउटपुट के रूप में।

क्या देता है?

उत्तर

12

doOnError और onErrorReturn बदलते व्यवहार के साथ एक नया Observable देता है। मैं मानता हूं कि उनके दस्तावेज थोड़ा भ्रामक हो सकता है। अपेक्षित व्यवहार प्राप्त करने के लिए अपने परीक्षणों को संशोधित करें:

// This one outputs "subscribe.onError" 
@Test 
public void observable_doOnError_subscribingToError() throws InterruptedException { 
    Observable<String> obs = 
     getErrorProducingObservable() 
      .doOnError(throwable -> System.out.println("doOnError")); 

    obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
     s -> {}, 
     error -> System.out.println("subscribe.onError") 
    ); 
    Thread.sleep(300); 
} 

// This one outputs "subscribe.onError" 
@Test 
public void observable_onErrorReturn() throws InterruptedException { 
    Observable<String> obs = 
     getErrorProducingObservable() 
      .onErrorReturn(throwable -> "Yeah I got this"); 

    obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe(
     s -> System.out.println("got: " + s), 
     error -> System.out.println("subscribe.onError") 
    ); 
    Thread.sleep(300); 
} 

private Observable<String> getErrorProducingObservable() { 
    return Observable.create(subscriber -> { 
     subscriber.onError(new RuntimeException("Somebody set up us the bomb")); 
    }); 
} 
+1

आह धन्यवाद। अब यह उम्मीद के अनुसार काम करता है, और मैंने सीखा है कि 'doOnError' ग्राहकों के व्यवहार को नहीं बदलेगा - आप बस एक दूसरा त्रुटि श्रोता जोड़ें। – Nilzor

संबंधित मुद्दे