2015-05-22 22 views
6

पर पकड़ें और ले जाएं मैं जिस तरह से अपेक्षित तरीके से आरएक्स के साथ त्रुटियों को संभालने के लिए संघर्ष कर रहा हूं।आरएक्सजेएस -

जब मेरे पास एक पर्यवेक्षक (उदाहरण के लिए, एक क्लिक स्ट्रीम से) होता है और एक अपवाद होता है तो मैं इसे पकड़ना चाहता हूं लेकिन आगे बढ़ना चाहता हूं। मैंने जिन सभी समाधानों का प्रयास किया है, वे त्रुटि को पकड़ने के बाद अवलोकन को समाप्त करते हैं। क्या पकड़ने और आगे बढ़ने का कोई तरीका है?

उदाहरण के तौर पर नीचे दिया गया अवलोकन "1", फिर "त्रुटि", लेकिन कभी "3" उत्सर्जित नहीं करेगा।

var range = Rx.Observable.range(1,3) 
    .map(function(i){ 
     if(i === 2){ 
     throw "Error"; 
     } else { 
     return i; 
     } 
    }) 
    .catch(function(e){ 
     return Rx.Observable.return(e) 
    }); 

range.subscribe(function(i){ 
    console.log(i) 
}); 
+0

स्रोत अनुक्रम के साथ आगे बढ़ने का एकमात्र तरीका फेंकना नहीं है। क्या आप हमें बता सकते हैं कि आपका असली उपयोग मामला क्या है? –

+0

अवलोकन योग्य अनुबंध यह है कि इसे पर्यवेक्षक को पैटर्न को छोड़ना चाहिए: (ऑननेक्स्ट) * (ऑनकंपलेट | ऑनरर)। तो जिस क्षण एक अनुक्रम ऑनरर को समाप्त करता है, वह समाप्त होता है। –

+0

@ ओलिवर वेचहोल्ड असली मामला एक क्लिक इवेंट देखने योग्य है, जो एक http अनुरोध में 'flatMap()' देखने योग्य है। यदि/जब http अनुरोध विफल रहता है, तो क्लिक करने योग्य क्लिक अब उत्सर्जित नहीं होता है। – MaxWillmo

उत्तर

9

अपने अपेक्षित व्यवहार प्रत्यक्ष अनुबंध (OnNext)* (OnCompleted|OnError) की वजह से प्राप्त नहीं किया जा सकता है, वहाँ ठीक से एक गर्म प्रत्यक्ष शुरू करने से इस के आसपास काम करने के व्यावहारिक तरीके हैं।

let hotRange = Rx.Observable.range(1,3).publish(); 

let safeRange = hotRange 
    .map(function (i) { 
    if (i === 2) { 
     throw "Error"; 
    } else { 
     return i; 
    } 
    }) 
    .retry(); 

safeRange.subscribe(i => console.log(i)); 
hotRange.connect(); 

See the JSBinrange इस प्रश्न में उल्लिखित पर्यवेक्षण एक ठंडा पर्यवेक्षण है। यह behaves as a movie है, इसलिए यदि कोई त्रुटि होती है और हम पुनः सदस्यता लेते हैं, तो हमें "फिल्म" की शुरुआत से सब्सक्राइब करना होगा, यानी 1 फिर "Error"

आपको शायद एक अनुमानित धारणा थी कि Rx.Observable.range(1, 3) एक जीवंत पर्यवेक्षक था, यानी, "गर्म"। चूंकि यह नहीं है, इसलिए मैंने publish() का उपयोग करके ऊपर hotRange बनाया है। इस तरह, यह अपने ग्राहकों को स्वतंत्र रूप से अपनी घटनाओं को छोड़ देगा। अगर हम किसी त्रुटि के बाद "आगे बढ़ने" में सक्षम होना चाहते हैं, तो हमें त्रुटियों के बिना हमारे स्रोत ("हॉटरेंज") की आवश्यकता है। यही कारण है कि range.map() गर्म पर्यवेक्षण नहीं है। retry()hotRange.map() पर त्रुटियों को पकड़ेंगे और इसे hotRange.map() से प्रतिस्थापित करें। क्योंकि hotRange गर्म है, retry() का प्रत्येक निष्पादन अलग होगा, क्योंकि इसे hotRange द्वारा उत्सर्जित पिछले मान याद नहीं हैं। तो जब 2 के कारण हुई त्रुटि को hotRange.map() द्वारा पुनः प्रयास में प्रतिस्थापित किया गया है, hotRange बाद में 3 उत्सर्जित करेगा, और त्रुटियों के बिना मानचित्र फ़ंक्शन को पास करेगा।

+0

यह समझ में आता है कि केवल एक ही अपवाद होगा। एन-केस 'रीट्री' में काम करने के लिए शायद 'पकड़' के बजाय बेहतर होगा। – paulpdaniels

+0

अच्छा बिंदु। मैंने जवाब अपडेट किया। धन्यवाद –

+0

@ AndréStaltz। लेकिन सब्सक्राइब विधि में, एक त्रुटि हैंडलर कुछ भी उत्सर्जित नहीं करता है। हम त्रुटि हैंडलर में त्रुटि कैसे प्राप्त कर सकते हैं? – xgrommx

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