2015-10-12 13 views
9

तुम क्यों flatMapfromPromise की क्या ज़रूरत है पुन: प्रयास करें काम करने के लिए प्राप्त करने के लिए?
आरएक्स fromPromise और पुन: प्रयास

var responseStream = Rx.Observable.just('/error'). 
     flatMap(requestUrl => { 
      return Rx.Observable.fromPromise(_this.$http.get(requestUrl)); 
    }); 

    responseStream. 
     retry(3). 
     subscribe(
     function (x) { 
      console.log('Next: ' + x); 
     }, 
     function (err) { 
      console.log('Error: ' + err); 
     }, 
     function() { 
      console.log('Completed'); 
     }); 

मैं औपचारिक पर कटौती करने के लिए चाहते हैं और बस है ('/ त्रुटि' स्थिति 500 ​​रिटर्न):

Rx.Observable.fromPromise(_this.$http.get('error')). 
     retry(3). 
     subscribe(
     function (x) { 
      console.log('Next: ' + x); 
     }, 
     function (err) { 
      console.log('Error: ' + err); 
     }, 
     function() { 
      console.log('Completed'); 
     }); 

कि दूसरे मामले में XHR कॉल केवल है एक बार निष्पादित

उत्तर

20

क्योंकि Promises में पुनः प्रयास करने के लिए कोई एपीआई नहीं है। fromPromise सिर्फ Promise को लपेट रहा है और इसे इसके बजाय एक पर्यवेक्षक के माध्यम से उत्सर्जित कर रहा है। जब आप _this.$http.get('error') पर कॉल करते हैं तो आपने पहले ही Promise बनाया है और यह पहले से ही उड़ान में है, इसलिए विधि को फिर से कॉल किए बिना वादा को फिर से प्रयास करने का कोई तरीका नहीं है।

flatMap के साथ लपेटने के कारण यह काम करता है क्योंकि जब आप Observable को पुनः प्रयास करते हैं तो यह वास्तव में वादा उत्पन्न करने वाली विधि को फिर से निष्पादित कर रहा है।

यदि वर्बोसिटी वास्तव में आपको चोट पहुंचा रही है, तो एहसास करें कि fromPromise विधि को कॉल करने की आवश्यकता के बिना कई ऑपरेटरों Promises का समर्थन करते हैं।

तो अपने उदाहरण और भी अधिक बस defer का उपयोग कर

var responseStream = Rx.Observable.just('/error') 
     .flatMap(requestUrl => _this.$http.get(requestUrl)); 

    responseStream 
     .retry(3) 
     .subscribe(
      (x) => console.log('Next: ' + x), 
      (err) => console.log('Error: ' + err), 
     () => console.log('Completed')); 

या करने के लिए नीचे कम किया जा सकता:

Observable.defer(() => _this.$http.get('/error')) 
    .retry(3) 
    .subscribe(
     (x) => console.log('Next: ' + x), 
     (err) => console.log('Error: ' + err), 
    () => console.log('Completed')); 
+0

धन्यवाद है कि मैं वास्तव में क्या देख रहा था! – Brett

+0

@paulpdaniels क्या मैं बस एक सादे फ़ंक्शन में वादा को लपेट सकता हूं और उसके बाद इसे इस तरह से प्रदान कर सकता हूं: Rx.Observable.from समझौता (getRequest) .retry .... जहां getRequest सादा कार्य है जो वादा करता है। वह है: फ़ंक्शन getRequest() {वापसी _this। $ http.get ('/ error')); } –

+0

@ शैलेश वैश्यमयान आप जिस आरएक्सजेएस का उपयोग कर रहे हैं उसके संस्करण पर निर्भर करता है। आरएक्सजेएस 4 आपको 'से समझौता' करने के लिए फ़ंक्शन पास करने की अनुमति देता है, जिसका सब्सक्राइब समय पर आलसी मूल्यांकन किया जाता है, हालांकि, यह आरएक्सजेएस 5 में गायब है। किसी भी तरह से, दोनों मामलों में 'defer' काम करता है – paulpdaniels

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