मैं नीचे दिए गए व्यवहार विषय का उपयोग करके एक शेयरडेटा सेवा का उपयोग कर रहा हूं। मेरी समस्या यह है कि हर बार जब मैं सेवा की अगली () विधि को कॉल करता हूं तो किसी अन्य घटक में श्रोता सदस्यता को कई बार कॉल किया जाता है, ऐसा लगता है कि इसे एक ही संदेश कई बार प्राप्त हुआ है। क्या यह अपेक्षित व्यवहार है? इसे कैसे रोकें?

सेवा एक सिंगलटन है। मैं संदेश बदलें को कई बार कॉल नहीं करता

@Injectable()
export class ShareDataService {

    messageSource = new BehaviorSubject(someData);
    currentMessage: Observable = this.messageSource.asObservable();
    changeMessage(message) {
        this.messageSource.next(message);
    }

}

घटक में सदस्यता

ngDoCheck() {
    this.shareDataService.currentMessage
        .pipe(takeUntil(this.ngUnsubscribe))
        .subscribe((message) => {
            //Do stuff
        }
    });
}
4
Mac_W 23 जुलाई 2018, 14:54
क्या आप सभी सदस्यताओं से सफलता कॉलबैक के क्रम को लॉग कर सकते हैं और हमें दिखा सकते हैं? व्यवहार विषय को अंतिम (पहले उत्सर्जित डेटा और वर्तमान उत्सर्जित डेटा भी) उत्सर्जित करना चाहिए, लेकिन बस यह सुनिश्चित करने के लिए लॉग दिखाएं जिसमें सफलता कॉलबैक के सभी अवसर होंगे
 – 
Vinod Bhavnani
23 जुलाई 2018, 14:57
1
next(...) सभी पर्यवेक्षकों (ग्राहकों) को मान भेजता है। हो सकता है कि आप एक ही घटक में अनेक सदस्यताएँ बना रहे हों।
 – 
martin
23 जुलाई 2018, 14:58
क्या आप वह कोड पोस्ट कर सकते हैं जहां आप वास्तव में सदस्यता लेते हैं?
 – 
David R
23 जुलाई 2018, 14:58
- बस अभी जोड़ा
 – 
Mac_W
23 जुलाई 2018, 15:18
- आपका क्या मतलब है? मैं एकाधिक घटकों में केवल एक बार सदस्यता लेता हूं
 – 
Mac_W
23 जुलाई 2018, 15:18

3 जवाब

सबसे बढ़िया उत्तर

हर बार ngDoCheck() कॉल करने पर एक नई सदस्यता जोड़ी जाती है। केवल एक बार मान प्राप्त करने के लिए first() का उपयोग करके देखें और फिर स्वचालित रूप से सदस्यता समाप्त करें .

ngDoCheck() {
    this.shareDataService.currentMessage
        .pipe(first())
        .subscribe((message) => {
            // Do stuff
        }
    });
}

अगली बार ngDoCheck के ट्रिगर होने पर, यह एक और एकमुश्त सदस्यता जोड़ता है।


यदि आपकी सदस्यता का एकमात्र उद्देश्य परिवर्तन का पता लगाने पर वर्तमान मूल्य प्राप्त करना है, तो आप अपने ShareDataService में एक साधारण get() फ़ंक्शन भी जोड़ सकते हैं, ताकि उसका वर्तमान मान वापस किया जा सके।

get() {
    return this.messageSource.getValue();
}
6
Jeffrey Roosendaal 23 जुलाई 2018, 18:00
1
मैं अब क्या मुद्दे हैं! यह अब कई संदेश भेज रहा है, यह सिर्फ परिवर्तन का पता लगाने पर चालू हो जाता है!
 – 
Mac_W
23 जुलाई 2018, 18:06
मुझे लगता है, क्योंकि दोनों के पास एक सक्रिय सदस्यता है, इसलिए जब उनमें से कोई अगला ट्रिगर करता है ()। दोनों सदस्यताएं आग लगती हैं, और दोनों पुनः लोड() को आग लगती हैं (फिर से)।
 – 
Jeffrey Roosendaal
21 मई 2019, 18:15
जवाब के लिए धन्यवाद। उस मुद्दे के समाधान के बारे में क्या? मैंने विषय बनाया और प्रत्येक विधि के लिए ईवेंट प्राप्त किया लेकिन मुझे यकीन नहीं है कि यह एक अच्छा विचार है या नहीं? क्या आप कृपया अपना सुझाव उस प्रश्न पर पोस्ट कर सकते हैं?
 – 
Jack
21 मई 2019, 22:40

क्या आप कृपया अपने ngOnDestroy() जीवनचक्र हुक में unsubscribe को कॉल करने का प्रयास कर सकते हैं

ngOnDestroy() {
    this.shareDataService.currentMessage.unsubscribe();
}

उम्मीद है ये मदद करेगा!

3
David R 23 जुलाई 2018, 15:19

मुझे भी इसी तरह की समस्या का सामना करना पड़ा और मैंने पाया कि मैंने अपने next() को नष्ट नहीं किया।

कृपया नीचे दिए गए कोड की जांच करें और इसे अपने onDestroy में जोड़ें। मुझे आशा है कि यह आपकी मदद कर सकता है!

ngOnDestroy() { this.messageSource.next(); }

शुभकामनाएं!!!

-1
Ambuj Khanna 22 मई 2020, 15:11