2015-11-18 10 views
19

जब मैं स्क्रैच से एक अवलोकन योग्य बनाता हूं, और पर्यवेक्षक त्रुटि है, तो पूरा करें, सब्सक्रिप्शन का पूरा हिस्सा कभी भी लागू नहीं होता है।rxjs देखने योग्य नहीं होता है जब कोई त्रुटि होती है

var observer = Rx.Observable.create(function(observer){ 
    observer.onError(new Error('no!')); 
    observer.onCompleted(); 
}) 

observer.subscribe(
    function(x) { console.log('succeeded with ' + x) }, 
    function(x) { console.log('errored with ' + x) }, 
    function() { console.log('completed') } 
) 

उत्पादन होता है:

errored with Error: no! 

मैं इसे होने की उम्मीद थी:

errored with Error: no! 
completed 

अगर मैं onError के बजाय onNext आह्वान करने के लिए कोड बदलने के लिए, नमूदार ठीक से पूरा करती है:

var observer = Rx.Observable.create(function(observer){ 
    observer.onNext('Hi!'); 
    observer.onCompleted(); 
}) 

observer.subscribe(
    function(x) { console.log('succeeded with ' + x) }, 
    function(x) { console.log('errored with ' + x) }, 
    function() { console.log('completed') } 
) 

मुझे मिलता है अपेक्षित आउटपुट:

succeeded with Hi! 
completed 

त्रुटि होने पर यह पूर्ण क्यों नहीं होता है?

उत्तर

21

ऐसा इसलिए है क्योंकि त्रुटि का अर्थ पूरा होने का मतलब है, इसलिए onCompleted से जुड़े कॉलबैक को कभी भी कॉल नहीं किया जाता है। आप यहां देख सकते हैं observables के लिए अनुबंध (http://reactivex.io/documentation/contract.html) Rxjs:

एक नमूदार शून्य या अधिक OnNext सूचनाएं, प्रत्येक एक भी उत्सर्जित आइटम का प्रतिनिधित्व कर सकते हैं और यह तब या तो एक OnCompleted या एक OnError द्वारा उन उत्सर्जन सूचनाएं अनुसरण कर सकते हैं अधिसूचना, लेकिन दोनों नहीं। एक OnCompleted या OnError अधिसूचना जारी होने पर, यह उसके बाद किसी भी जारी नहीं हो सकता है आगे

त्रुटि प्रबंधन के लिए notifications.`, आप पर एक नजर है कर सकते हैं: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/errors.md

+3

धन्यवाद! मैं वहां यह स्पष्टीकरण देखता हूं: ऑनरर इंगित करता है कि अवलोकन करने योग्य एक निर्दिष्ट त्रुटि स्थिति के साथ समाप्त हो गया है और यह कोई और आइटम उत्सर्जित नहीं करेगा –

6

जबकि मैं एक ही सवाल हो रही थी, मैं इस github issue में टक्कर लगी।

स्पष्ट रूप से finallyObservable ऑब्जेक्ट की विधि इस मामले में उपयोग की आवश्यकता है।

कि धागे से Aleksandr-Leotech से हवाला देते हुए:

पूरा और अंत में पूरी तरह से अलग बातें हैं। पूरा मतलब है कि अवलोकन योग्य स्टीम सफलतापूर्वक समाप्त हो गया था। क्योंकि आपके पास कई सफलता कॉल हो सकते हैं। अंत में इसका मतलब है कि भाप समाप्त हो गया है, या तो सफलतापूर्वक या नहीं।

यह HTTP अनुरोधों के साथ स्पष्ट नहीं है, लेकिन दो अतिरिक्त परिदृश्यों की कल्पना करें।

  1. माउस ईवेंट। आपको कॉलबैक की सफलता का कभी भी समाप्त होने वाला भाप प्राप्त नहीं होगा, लेकिन आपको कभी भी अंततः या पूर्ण प्राप्त नहीं होगा, क्योंकि उपयोगकर्ता ईवेंट कभी नहीं रुकेंगे (जब तक आप बग्गी कोड के साथ अपवाद ट्रिगर नहीं करते हैं, तो आपको त्रुटि मिल जाएगी और अंत में)।

  2. वेब सॉकेट के साथ काम करना। आपको कई सफलता कॉलबैक मिलेगा, लेकिन कुछ समय पर बैक एंड के साथ आपका संचार बंद हो जाएगा और आप दोनों पूर्ण और आखिरकार प्राप्त करेंगे जब तक कि आपको कुछ त्रुटियां न हों, जो त्रुटि और अंत में कॉल करेगी।

तो, आपको कई या कोई सफलता कॉल, शून्य या एक त्रुटि कॉल, शून्य या एक पूर्ण और शून्य या अंत में मिल रहा है।

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

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