2017-01-06 8 views
8

में मैं क्या "निपटाने" या "सदस्यता समाप्त" समारोह के प्रयोजन के लिए, है जो (वैकल्पिक) एक नमूदार "प्रबंधक" समारोह से लौट आए है के बारे में उलझन में हूँ, जैसे इतना:"सदस्यता छोड़ें" समारोह कॉलबैक/हुक प्रत्यक्ष "प्रबंधक" समारोह

const Rx = require('rxjs'); 

const obs = Rx.Observable.create(obs => { 

    // we are in the Observable "executor" function 
    obs.next(4); 

    // we return this function, which gets called if we unsubscribe 
    return function() { 
     console.log('disposed'); 
    } 

}); 

    const s1 = obs.subscribe(
     function (v) { 
      console.log(v); 
     }, 
     function (e) { 
      console.log(e); 
     }, 
     function() { 
      console.log('complete'); 
     } 
    ); 

    const s2 = obs.subscribe(
     function (v) { 
      console.log(v); 
     }, 
     function (e) { 
      console.log(e); 
     }, 
     function() { 
      console.log('complete'); 
     } 
    ); 


    s1.unsubscribe(); 
    s2.unsubscribe(); 

क्या मुझे confuses कि इस तरह के एक समारोह वास्तव में अधिक अपने कोड में संदर्भ पर पकड़ और इसलिए कचरा संग्रहण को रोकने के लिए की संभावना होगी है।

किसी को भी मुझे बता सकते हैं क्या प्रयोजन है कि परिदृश्य में एक समारोह लौटने, क्या समारोह में कहा जाता है की है, और यह हस्ताक्षर है क्या है? मुझे इसके बारे में जानकारी जानने में परेशानी हो रही है।

let index = 0; 

    let obsEnqueue = this.obsEnqueue = new Rx.Subject(); 

    this.queueStream = Rx.Observable.create(obs => { 

     const push = Rx.Subscriber.create(v => { 
      if ((index % obsEnqueue.observers.length) === obsEnqueue.observers.indexOf(push)) { 
       obs.next(v); 
      } 
     }); 

     return obsEnqueue.subscribe(push); 
    }); 

यह बजाय सिर्फ एक सादे समारोह के एक सदस्यता वापस जाने के लिए लगता है:

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

यह एक स्पष्ट सवाल बनाने के लिए, यह कर के बीच अंतर क्या है:

const sub = new Rx.Subject(); 

const obs = Rx.Observable.create($obs => { 

    $obs.next(4); 
    return sub.subscribe($obs); 

}); 

और का परिणाम नहीं लौटा रहा सदस्यता के फोन:

const sub = new Rx.Subject(); 

const obs = Rx.Observable.create($obs => { 

    $obs.next(4); 
    sub.subscribe($obs); 

}); 
+0

मुझे यकीन है कि अगर यह वास्तव में एक "प्रबंधक" समारोह कहा जाता है नहीं कर रहा हूँ, लेकिन उस वादे दुनिया – Olegzandr

उत्तर

4

unsubscribe को समारोह है कि Rx.Observable.create जरूरतों वापसी तब होती है जब डाउनस्ट्रीम स्ट्रीम को नहीं सुनता है, प्रभावी रूप से संसाधनों को साफ करने के लिए आपको समय देता है।

अपने प्रश्न के संबंध में; .subscribe() वह सदस्यता देता है जिस पर आप .unsubscribe() पर कॉल कर सकते हैं। इसलिए यदि आप एक अन्य सदस्यता आप पाइप कर सकते हैं कि सदस्यता के माध्यम से अपने बहाव के साथ कुछ करना चाहता हूँ: अंतराल आंतरिक रूप से बनाई गई

const obs = Rx.Observable.create($obs => { 
 
     const timer = Rx.Observable.interval(300) 
 
     .do(i => console.log('emission: ' + i)) 
 

 
     return timer.subscribe($obs); 
 
    }); 
 
    obs.take(4).subscribe(i => console.log('outer-emission:'+i))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.2/Rx.js"></script>

सदस्यता समाप्त समारोह आप नमूदार को सुन बंद कर देंगे बिना लेकिन

const obs = Rx.Observable.create($obs => { 
 
    const timer = Rx.Observable.interval(300) 
 
    .do(i => console.log('emission: ' + i)) 
 
    .take(10) 
 
    .subscribe(
 
     val => $obs.next(val), 
 
     err => $obs.error(err), 
 
    () => $obs.complete() 
 
    ); 
 

 
    return function(){} // empty unsubscribe function, internal subscription will keep on running 
 
}); 
 
obs.take(4).subscribe(i => console.log('outer-emission:'+i))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.2/Rx.js"></script>

: चलते रहते हैं होगा
+0

हाय मार्क में एनालॉग के नाम है, धन्यवाद! अपना पहला कोड ब्लॉक में, यदि मैं टाइमर वापसी नहीं है, लेकिन सब कुछ एक ही छोड़ देते हैं, तो चीजें अपेक्षा के अनुरूप काम (वहाँ है कि क्या मैं timer.do वापसी या सिर्फ timer.do फोन है, तो यकीन नहीं करता है, तो कोई फर्क नहीं प्रतीत हो रहा है आपके स्पष्टीकरण 100% सही है? ऐसा लगता है कि टाइमर वापस नहीं आ रहा है। डब्ल्यू कॉल ठीक है (पहले उदाहरण में)? दूसरे उदाहरण के बारे में, मुझे लगता है कि उत्सर्जन 4 ले जाने के बाद भी लॉग हो जाता है। – Olegzandr

+0

लेकिन पहले उदाहरण में अगर हम timer.do चीजें अभी भी काम न करें! मुझे यह नहीं मिला। – Olegzandr

+1

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

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