2017-03-09 11 views
6

मैं समझता हूं कि मुझे अवशोषित प्रमाणपत्रों को अवश्य लिखना चाहिए (यानी: वे पर्यवेक्षकों जिनमें अनंत मान है) जब स्मृति रिसाव को रोकने के लिए घटक नष्ट हो जाते हैं। मुझे परिमित पर्यवेक्षकों के लिए ऐसा करने की आवश्यकता नहीं है क्योंकि वे पूर्ण हो जाएंगे और स्वचालित रूप से unsubscribe होंगे।कोणीय 2/आरएक्सजे: क्या मुझे वास्तव में सदस्यता समाप्त करने की आवश्यकता है?

लेकिन अगर मैं बनाने के एक अनंतObservable मेरी घटक में (उदाहरण के FormGroup.valueChanges, या QueryList.changes के लिए), यह एक घटक है कि यह शामिल है के साथ नष्ट हो जाएगा, तो मैं है कि वे कोई स्मृति रिसाव भी हो जाएगा लगता है अगर मैं से सदस्यता रद्द नहीं करता हूं।

यहाँ एक सरल उदाहरण है:

@Component({}) 
export class DummyComponent { 
    form: FormGroup; 

    constructor(private fb: FormBuilder) { 
     this.form = this.fb.group({ 
      firstName: [''], 
      lastName: [''] 
     }); 
     this.form.valueChanges.subscribe(
      x => console.log(x) 
     ); 
    } 
} 

यहाँ, मैं नहीं unsubscribethis.form.valueChanges से करते हैं; जब मेरा घटक नष्ट हो जाता है, तो this.form.valueChanges भी नष्ट हो जाएगा।

क्या इस मामले में स्मृति रिसाव होगी?

+3

क्या आपने सब्सक्राइब करने के लिए एक पूर्ण कॉलबैक जोड़ने की कोशिश की है (...) और जांच की जाती है कि घटक नष्ट होने पर इसे कॉल किया जाता है या नहीं? –

+0

मैंने किया, और इसे नहीं कहा जाता है (मैंने केवल 'this.form.valueChanges' के साथ परीक्षण किया था)। – freedonaab

+0

मुझे लगता है कि यह बेहतर है लेकिन सदस्यता समाप्त करने के लिए आवश्यक नहीं है। मैं स्मृति रिसाव की अपेक्षा नहीं करता क्योंकि जब घटक नष्ट हो जाता है, तो उसे कचरा इकट्ठा किया जाएगा, और इसके साथ आपकी सदस्यता होगी। यदि आप घटक के बाहर सदस्यता सदस्यता लेते हैं या पास करते हैं (उदाहरण के लिए एक सेवा) तो यह घटक को जीसीडी होने से रोक सकता है, लेकिन यदि सभी घटक के भीतर हैं तो इसे चोट नहीं पहुंची जानी चाहिए। –

उत्तर

4

जैसा कि बाबर ने उल्लेख किया था, आपको परिवर्तनों को देखने के लिए उन सदस्यता को रोकने के लिए सदस्यता समाप्त करने की आवश्यकता है।

आपके विशेष मामले के लिए मुझे लगता है कि आपके पास एक बिंदु है।

एक चीज जो मैं करता हूं जब मेरे पास एक ही घटक में बहुत सारी सदस्यता होती है तो निम्न है।

सबसे पहले मैं "सदस्यता", सदस्यता प्रकार का एक खाली ऐरे बना देता हूं।

private subscriptions: Subscription[] = []; 

तो हर बार मैं सदस्यता करने की जरूरत है मैं इसे सरणी

this.subscriptions.push(this.form.valueChanges.subscribe(x => console.log(x))); 

में धक्का और ngOnDestroy में मैं सरणी के अंदर हर सदस्यता के लिए सदस्यता समाप्त।

ngOnDestroy(): void { 
    this.subscriptions.forEach((elem) => { elem.unsubscribe(); }) 
} 
+1

आप सदस्यता.add() विधि के साथ एक-दूसरे के लिए सदस्यता जोड़ सकते हैं। फिर आपको केवल शीर्ष सदस्यता की सदस्यता समाप्त करने की आवश्यकता है। – DarkNeuron

2

जब आपका घटक नष्ट हो जाता है तो आपके ग्राहक नहीं हैं कि वे अभी भी किसी भी घटना के लिए इंतजार कर रहे हैं, इसके लिए स्मृति की लागत होगी और साथ ही कभी-कभी यह आपके तर्कों को भी परेशान कर सकता है। उदाहरण के लिए राउटर इवेंट सदस्यता यह आपके ऐप में हर जगह ट्रिगर करेगी और आपके द्वारा सब्सक्रिप्शन के अंदर किए गए कोड को निष्पादित करेगी।

यदि आप घटकों के बीच स्विच करते हैं और कभी भी आपके ऐप की सदस्यता समाप्त नहीं कर लेते हैं तो दूसरा मामला समय के बाद लटका दिया जाएगा क्योंकि जब भी आप घटक को लोड करते हैं तो नए ग्राहक बांधते हैं।

@Component({}) 
export class DummyComponent implements OnDestroy { 
form: FormGroup; 
subscription: Subscription; // from rxjs 
constructor(private fb: FormBuilder) { 
    this.form = this.fb.group({ 
     firstName: [''], 
     lastName: [''] 
    }); 
    this.subscription = this.form.valueChanges.subscribe(
     x => console.log(x) 
    ); 
} 

ngOnDestroy(): void { 
    this.subscription.unsubscribe(); 
} 
} 
संबंधित मुद्दे

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