अवलोकन योग्य अंत में सदस्यता लें


105

इस कला के अनुसार , onCompleteऔर के onErrorकार्य subscribeपरस्पर अनन्य हैं।

मतलब या तो onErrorया onCompleteघटनाओं मेरे में सक्रिय होंगे subscribe
मेरे पास एक तर्क खंड है जिसे निष्पादित करने की आवश्यकता है कि क्या मुझे कोई त्रुटि मिलती है, या मैं अपनी जानकारी की भाप सफलतापूर्वक समाप्त कर देता हूं।

मैं finallyअजगर की तरह कुछ के लिए देखा है , लेकिन मुझे मिल गया है finallyजो मैं देख बनाने के लिए संलग्न करने की आवश्यकता है।

लेकिन मैं उस तर्क को केवल तभी करना चाहता हूं जब मैं सदस्यता लेता हूं, और धारा समाप्त होने के बाद, चाहे वह सफलतापूर्वक हो या त्रुटि के साथ।

कोई विचार?

जवाबों:


130

इस ऑपरेटर का वर्तमान "पाइप करने योग्य" संस्करण कहा जाता है finalize()(RxJS 6 के बाद से)। पुराने और अब हटाए गए "पैच" ऑपरेटर को बुलाया गया थाfinally() (RxJS 5.5 तक)।

मुझे लगता है कि finalize()ऑपरेटर वास्तव में सही है। तुम कहो:

उस तर्क को केवल तब करें जब मैं सदस्यता लेता हूं, और धारा समाप्त होने के बाद

मुझे लगता है कि एक समस्या नहीं है। यदि आप चाहते हैं तो सदस्यता लेने से पहले आपके पास एक एकल sourceऔर उपयोग finalize()हो सकता है। इस तरह से आपको हमेशा उपयोग करने की आवश्यकता नहीं होती है finalize():

let source = new Observable(observer => {
  observer.next(1);
  observer.error('error message');
  observer.next(3);
  observer.complete();
}).pipe(
  publish(),
);

source.pipe(
  finalize(() => console.log('Finally callback')),
).subscribe(
  value => console.log('#1 Next:', value),
  error => console.log('#1 Error:', error),
  () => console.log('#1 Complete')
);

source.subscribe(
  value => console.log('#2 Next:', value),
  error => console.log('#2 Error:', error),
  () => console.log('#2 Complete')
);

source.connect();

यह प्रिंट करने के लिए कंसोल:

#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message

जनवरी 2019: आरएक्सजेएस 6 के लिए अपडेट किया गया


1
दिलचस्प है कि यह वादे के विपरीत पैटर्न की तरह है, इस पद्धति में finally()पहले जोड़ा जाता है, और सदस्यता अनिवार्य रूप से पास / असफल हो जाती है।
ब्रैडग्रेन

7
हाँ, यह बहुत बुरा है। कोई यह सोचेगा कि finallyब्लॉक आपके कोड में आएगा।
d512

मुझे Angular JS का वादा सिस्टम पसंद आया ... जैसा कि d512 कहता है कि मुझे "अंतिम" होने की उम्मीद थी ... इसे बिल्कुल पसंद न करें ...
Sampgun

10
आरएक्सजेएस 5.5 के रूप में, "अंत में" अब एक अवलोकन योग्य विधि नहीं है। इसके बजाय "फाइनल करें" ऑपरेटर का उपयोग करें: source.pipe (फाइनल करें () => कंसोल.लॉग ('अंत में कॉलबैक'))) सदस्यता लें (...); github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md
Stevethemacguy

अंतिम रूप से समस्या यह है कि यह "पूर्ण ()" कॉल की प्रतीक्षा कर रहा है। क्या होगा यदि आप प्रत्येक उत्सर्जन पर अंततः चाहते हैं (यदि अवलोकन योग्य उत्सर्जन सफलता है एक , अगर यह त्रुटि करता है, तो इसके बजाय b करें .. दोनों मामलों में, c )?
रोबर्टो टोमस

65

केवल एक चीज जो मेरे लिए काम करती है वह है

fetchData()
  .subscribe(
    (data) => {
       //Called when success
     },
    (error) => {
       //Called when error
    }
  ).add(() => {
       //Called when operation is complete (both success and error)
  });

26

मैं अब RxJS 5.5.7 को एक कोणीय अनुप्रयोग में उपयोग कर रहा हूं और finalizeऑपरेटर ने मेरे उपयोग के मामले के लिए एक अजीब व्यवहार किया है क्योंकि सफलता या त्रुटि कॉलबैक से पहले निकाल दिया गया है।

सरल उदाहरण:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000),
    finalize(() => {
      // Do some work after complete...
      console.log('Finalize method executed before "Data available" (or error thrown)');
    })
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );

मुझे जो चाहिए, उसे addपूरा करने के लिए मुझे सदस्यता में मेडहेड का उपयोग करना पड़ा है । मूल रूप finallyसे सफलता या त्रुटि कॉलबैक के बाद कॉलबैक किया जाता है। एक try..catch..finallyब्लॉक की तरह याPromise.finally विधि की तरह।

सरल उदाहरण:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000)
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );
  .add(() => {
    // Do some work after complete...
    console.log('At this point the success or error callbacks has been completed.');
  });

आपकी मदद करके प्रसन्नता हुई।
pcasme
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.