2015-11-24 33 views
5

मेरा उपयोग केस सफलता और विफलता के कार्यों को फिर से करने के लिए एक पर्यवेक्षक को मानचित्र बनाना है। मैं नेटवर्क कॉल करता हूं (एक फ़ंक्शन के साथ जो वादा करता है), यदि यह सफल होता है तो मुझे सफलता की कार्रवाई अग्रेषित करनी होती है, अगर यह किसी त्रुटि कार्रवाई से विफल हो जाती है। पर्यवेक्षक खुद ही जारी रहेगा। मैं खोज सकता हूं, आरएक्सजेएस में इस त्रुटि को पकड़ने और मूल को पुनः प्रयास करने के लिए कोई तंत्र नहीं है।आरएक्सजेएस कैच ** और ** एक अवलोकन योग्य

error$ = new Rx.Subject(); 

searchResultAction$ = search$ 
    .flatMap(getSearchResultsPromise) 
    .map((resuls) => { 
     return { 
      type: 'SUCCESS_ACTION', 
      payload: { 
       results 
      } 
     } 
    }) 
    .retryWhen((err$) => { 
     return err$ 
      .pluck('query') 
      .do(error$.onNext.bind(error$)); 
    }); 

searchErrorAction$ 
    .map((query) => { 
     return { 
      type: 'ERROR_ACTION', 
      payload: { 
       query, 
       message: 'Error while retrieving data' 
      } 
     } 
    }); 

action$ = Observable 
    .merge(
     searchResultAction$, 
     searchErrorAction$ 
    ) 
    .doOnError(err => console.error('Ignored error: ', err)) 
    .retry(); 

action$.subscribe(dispatch); 

यानी मैं एक विषय बनाने के लिए, और उस विषय में त्रुटियों को धक्का और उस से त्रुटि कार्यों की एक नमूदार बनाने: मैं अपने कोड में समाधान जो मैं के साथ खुश नहीं हूँ निम्नलिखित है।

क्या आरएक्सजेएस में ऐसा करने का बेहतर विकल्प है कि मुझे याद आ रही है? असल में मैं क्या त्रुटि उत्पन्न हुई है, इसकी एक अधिसूचना उत्सर्जित करना चाहता हूं, और तब भी जो भी पर्यवेक्षक पहले से कर रहा है उसके साथ जारी रहना चाहता हूं।

उत्तर

9

यह पुन: प्रयास होगा असफल प्रश्नों:

var action$ = search$ 
    .flatMap(value => { 
     // create an observable that will execute 
     // the query each time it is subscribed 
     const query = Rx.Observable.defer(() => getSearchResultsPromise(value)); 

     // add a catch clause to "ignore" the error 
     return query.catch(err => { 
      console.log("ignoring error: ", err); 
      return Observable.empty(); // no result for this query 
     })); 
    }) 
    .map(payload => ({ type: "SUCCESS_ACTION", payload })); 

action$.subscribe(dispatcher); 
+0

आह:

var action$ = search$ .flatMap(value => { // create an observable that will execute // the query each time it is subscribed const query = Rx.Observable.defer(() => getSearchResultsPromise(value)); // add a retry operation to this query return query.retryWhen(errors$ => errors$.do(err => { console.log("ignoring error: ", err); })); }) .map(payload => ({ type: "SUCCESS_ACTION", payload })); action$.subscribe(dispatcher); 

आप पुनः प्रयास करना नहीं चाहते हैं, लेकिन सिर्फ सूचित या त्रुटियों को अनदेखा करना चाहते हैं! घोंसला देखा जा सकता है। मैंने इसके बारे में क्यों नहीं सोचा! मान लें कि अवलोकन करने योग्य दुनिया में उपयोग करने में अधिक समय लगेगा। धन्यवाद। – channikhabra

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