2017-11-15 44 views
5

हमने अपने अनुप्रयोगों में से एक को एंगुलर 5 में अपग्रेड कर दिया है, और 0xमें संक्रमण के रूप में आरएक्सजेएस v5.5 में पेश किया गया है।Lettable rxjs ऑपरेटरों के संयुक्त पाइप में त्रुटि पकड़ें

इस वजह से, हमने .pipe() ऑपरेटर के साथ नए सिंटेक्स में हमारी अवलोकन योग्य पाइपलाइनों को फिर से लिखा है।

हमारे पिछले कोड .switchMap() अंदर इस प्रकार दिखाई देगा, एक .catch() साथ करता है, तो एक त्रुटि फेंक दिया जाता है के रूप में प्रभाव के संचालन को बाधित नहीं करने के लिए।

@Effect() 
loadData$ = this.actions$ 
.ofType(LOAD_DATA) 
.map((action: LoadData) => action.payload) 
.withLatestFrom(this.store.select(getCultureCode)) 
.switchMap(([payload, cultureCode]) => this.dataService.loadData(payload, cultureCode) 
    .map(result => { 
    if (!result) { 
     return new LoadDataFailed('Could not fetch data!'); 
    } else { 
     return new LoadDataSuccessful(result); 
    } 
    }) 
    .catch((err, caught) => { 
    return Observable.empty(); 
    }); 
); 

एक (यहाँ से निपटने त्रुटि सरलीकृत) dataService यह पकड़ लिया और हैंडल किया जाएगा करने के लिए कॉल में फेंक दिया त्रुटि के मामले में।

नई वाक्य रचना और .pipe() के उपयोग के साथ

, अब हम इस

@Effect() 
loadData$ = this.actions$ 
.ofType(LOAD_DATA) 
.pipe(
    map((action: LoadData) => action.payload), 
    withLatestFrom(this.store.select(getCultureCode)), 
    switchMap(([payload, cultureCode]) => this.dataService.loadData(payload, cultureCode)), 
    map(result => { 
    if (!result) { 
     return new LoadDataFailed('Could not fetch data!'); 
    } else { 
     return new LoadDataSuccessful(result); 
    } 
    }) 
); 

मैं कैसे इसी तरह से किसी भी फेंक दिया त्रुटियों नमूदार पाइप लाइन में, नए सिंटैक्स का उपयोग पकड़ कर सकते हैं है?

+0

पुनर्रचना के बाद आप ले जाया गया '' map' switchMap' प्रक्षेपण से बाहर है, इसलिए किसी भी त्रुटि बाहरी धारा बंद हो जाएगा। कुछ ऐसा: 'स्विचमैप (([पेलोड, संस्कृतिकोड]) => this.dataService.loadData (पेलोड, संस्कृति कोड)। पाइप (मानचित्र ..., पकड़ो ...))' नौकरी करना चाहिए। –

+1

महान @arturgrzesiak काम करता है! इसे एक उत्तर के रूप में पोस्ट करें और मैं इसे स्वीकार करूंगा! :) –

उत्तर

5

रीफैक्टरिंग के बाद mapswitchMap प्रक्षेपण से बाहर चला गया, इसलिए कोई भी त्रुटि बाहरी स्ट्रीम को बंद कर देगी। दोनों धाराओं बराबर रखने के लिए, आप प्रक्षेपण ही उस तरह में pipe उपयोग करने की आवश्यकता:

@Effect() 
loadData$ = this.actions$ 
.ofType(LOAD_DATA) 
.pipe(
    map((action: LoadData) => action.payload), 
    withLatestFrom(this.store.select(getCultureCode)), 
    switchMap(([payload, cultureCode]) => 
    this.dataService.loadData(payload, cultureCode) 
     .pipe(
     map(result => { 
      if (!result) { 
      return new LoadDataFailed('Could not fetch data!'); 
      } else { 
      return new LoadDataSuccessful(result); 
      } 
      }), 
     catchError((err, caught) => { 
      return Observable.empty(); 
     }) 
    ) 
) 
); 
+1

यह ठीक वैसे ही काम करता है जैसा कि मैंने इरादा किया था, हालांकि 'कैच' का नाम बदलकर' कैच एरर 'कर दिया गया है! धन्यवाद! –

+1

ओह धन्यवाद - 'पकड़' एक आरक्षित कीवर्ड है –

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