2017-08-03 27 views
5

संक्षेप में: प्रत्येक .subscribe से पहले .catch डाले बिना स्ट्रीम में त्रुटि के बाद सुनना कैसे आगे बढ़ें?आरएक्सजेएस त्रुटि पर सदस्यता क्यों लेता है?

आपको और अधिक जानकारी की जरूरत है वे यहां हैं:

चलें मान मैं वर्तमान उपयोगकर्ता या नल के अधीन रहते हुए की है। मुझे कभी-कभी एपीआई से डेटा मिलता है और विषय को भेजता है। यह तदनुसार दृश्य को अद्यतन करता है। लेकिन किसी बिंदु पर मेरे सर्वर पर त्रुटि होती है और मैं चाहता हूं कि मेरा एप्लिकेशन पहले के रूप में काम करना जारी रखे लेकिन त्रुटि के बारे में कुछ स्थानों को सूचित करे और मेरे विषय को सुनें।

शुरू में मैंने सोचा था कि यह केवल .catch कॉलबैक और ग्राहकी लेने पर error संचालकों को गति प्रदान करने और सभी सफलता संचालकों और जंजीरों को छोड़ देगा, तो मैं सिर्फ userSubject.error(...) है। और यदि मैं userSubject.next(...) पर कॉल करता हूं तो मेरी सभी श्रृंखलाएं और ग्राहक

पर काम करेंगे, लेकिन अनजाने में यह मामला नहीं है। पहले uncaught .error के बाद यह स्ट्रीम से ग्राहकों की सदस्यता रद्द करता है और वे अब और अधिक काम नहीं करते हैं।

तो मेरा प्रश्न: क्यों ??? और यदि मैं null सामान्य रूप से मानना ​​चाहता हूं लेकिन कुछ स्थानों पर केवल त्रुटियों को संभालना चाहता हूं तो इसके बजाय क्या करना है?

यहाँ RxJs स्रोत कोड के लिए लिंक है, जहां त्रुटि पर सब्सक्राइबर सदस्यता समाप्त करने पर https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts#L140

उत्तर

5

Rx observables follow the grammarnext*(error|complete)?, जिसका अर्थ है कि वे कुछ भी नहीं उत्पादन कर सकते हैं error या complete अधिसूचना के बाद दिया गया है।

यह क्यों महत्वपूर्ण है Rx design guidelines से पाया जा सकता है की एक व्याख्या:

एकल संदेश का संकेत एक नमूदार अनुक्रम समाप्त हो गया है सुनिश्चित करता है कि प्रत्यक्ष अनुक्रम के उपभोक्ताओं को निर्धारणात्मक स्थापित कर सकते हैं कि है कि यह सफाई कार्रवाई करने के लिए सुरक्षित है ।

एक एकल विफलता यह सुनिश्चित करती है कि निरंतर सेमेन्टिक्स ऑपरेटरों के लिए बनाए रखा जा सके जो एकाधिक अवलोकन अनुक्रमों पर काम करते हैं।

संक्षेप में, आप अपने पर्यवेक्षकों के बाद एक सर्वर त्रुटि हुई है विषय को सुन रखने के लिए, इस विषय के लिए कि त्रुटि वितरित नहीं, बल्कि किसी अन्य तरीके से इसे संभाल (जैसे का उपयोग catch, retry चाहते हैं या एक समर्पित विषय में त्रुटि प्रदान)।

+0

धन्यवाद समझा! – mgrinko

3

प्रत्येक पर्यवेक्षक शून्य या अधिक next नोटिफिकेशन और एक error या complete उत्सर्जित करता है लेकिन दोनों कभी नहीं।

इस कारण से, विषयों में आंतरिक स्थिति होती है।

फिर यह निर्भर करता है कि आप अपनी श्रृंखला कैसे बनाते हैं। उदाहरण के लिए आप retry() का उपयोग अपने स्रोत के पुन: सदस्यता के लिए त्रुटि पर अवलोकन कर सकते हैं।

या जब आप अपने विषय के लिए मान प्रदान कर आप केवल next सूचनाएं भेजने और अनदेखा कर सकते हैं अन्य दो:

.subscribe(v => subject.next(v)); 

या आप त्रुटि फेंक करना चाहते हैं जब उपयोगकर्ता null है आप किसी भी ऑपरेटर कि कैप्चर उपयोग कर सकते हैं अपवाद और उन्हें त्रुटि अधिसूचनाओं के रूप में भेजता है। उदाहरण के लिए:

.map(v => { 
    if (v === null) { 
     throw new Error("It's broken"); 
    } 
    return v; 
}) 

वैसे भी किसी भी कोड के बिना अधिक सटीक सलाह देना मुश्किल है।

+0

धन्यवाद आप सीखेंगे कि 'पुनः प्रयास करें') क्या है – mgrinko

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