परीक्षण, पढ़ने के प्रलेखन और HttpClient के सोर्सकोड के कुछ समय बाद।
HttpClient:
https://github.com/angular/angular/blob/master/packages/common/http/src/client.ts
HttpXhrBackend :
https://github.com/angular/angular/blob/master/packages/common/http/src/xhr.ts
HttpClientModule
: https://indepth.dev/exploring-the-httpclientmodule-in-angular/
कोणीय एकजुटता: https://blog.angular-university.io/angular-http/
यह विशेष प्रकार की वेधशालाएँ एकल-मूल्य धाराएँ हैं: यदि HTTP अनुरोध सफल होता है, तो ये वेधशालाएँ केवल एक मान का उत्सर्जन करेंगी और फिर पूर्ण होंगी
और सदस्यता समाप्त करने के लिए "क्या मुझे जरूरत है" के पूरे मुद्दे का जवाब?
निर्भर करता है।
Http कॉल Memoryleaks कोई समस्या नहीं है। आपके कॉलबैक फ़ंक्शन में समस्याएँ तर्क हैं।
उदाहरण के लिए: रूटिंग या लॉगिन।
यदि आपका कॉल एक लॉगिन कॉल है, तो आपको "सदस्यता समाप्त" करने की ज़रूरत नहीं है, लेकिन यदि उपयोगकर्ता पृष्ठ छोड़ देता है, तो आपको यह सुनिश्चित करने की आवश्यकता है कि आप उपयोगकर्ता की अनुपस्थिति में प्रतिक्रिया को ठीक से संभालते हैं।
this.authorisationService
.authorize(data.username, data.password)
.subscribe((res: HttpResponse<object>) => {
this.handleLoginResponse(res);
},
(error: HttpErrorResponse) => {
this.messageService.error('Authentication failed');
},
() => {
this.messageService.info('Login has completed');
})
कष्टप्रद से खतरनाक तक
अब बस कल्पना करें, नेटवर्क सामान्य से धीमा है, कॉल में 5 सेकंड का समय लगता है, और उपयोगकर्ता लॉगिन दृश्य छोड़ देता है और "समर्थन दृश्य" पर जाता है।
घटक सक्रिय नहीं हो सकता है लेकिन सदस्यता है। एक प्रतिक्रिया के मामले में, उपयोगकर्ता को अचानक पुन: आउट किया जाएगा (आपके हैंडल पर निर्भर करता है) (कार्यान्वयन)।
यह अच्छा नहीं है।
इसके अलावा बस कल्पना करें कि उपयोगकर्ता पीसी को छोड़ देता है, विश्वास है कि वह अभी तक लॉग इन नहीं हुआ है। लेकिन आप तर्क उपयोगकर्ता को लॉग इन करते हैं, अब आपके पास एक सुरक्षा मुद्दा है।
आप सदस्यता समाप्त किए बिना क्या कर सकते हैं?
क्या आप कॉल को वर्तमान स्थिति पर निर्भर करते हैं:
public isActive = false;
public ngOnInit(): void {
this.isActive = true;
}
public ngOnDestroy(): void {
this.isActive = false;
}
.pipe(takeWhile(value => this.isActive))
यह सुनिश्चित करने के लिए कि प्रतिक्रिया सक्रिय होने पर उपयोगकर्ता को केवल हैंडल किया जाता है।
this.authorisationService
.authorize(data.username, data.password).pipe(takeWhile(value => this.isActive))
.subscribe((res: HttpResponse<object>) => {
this.handleLoginResponse(res);
},
(error: HttpErrorResponse) => {
this.messageService.error('Authentication failed');
},
() => {
this.messageService.info('Login has completed');
})
लेकिन आप यह कैसे सुनिश्चित कर सकते हैं कि सदस्यता मेमोरीली का कारण नहीं बन रही है?
यदि आप "taddownLogic" लागू होते हैं तो लॉग इन कर सकते हैं।
जब सबक्रिप्शन खाली या सदस्यता समाप्त हो जाती है, तो एक सदस्यता की अशांति को कहा जाएगा।
this.authorisationService
.authorize(data.username, data.password).pipe(takeWhile(value => this.isActive))
.subscribe((res: HttpResponse<object>) => {
this.handleLoginResponse(res);
},
(error: HttpErrorResponse) => {
this.messageService.error('Authentication failed');
},
() => {
this.messageService.info('Login has completed');
}).add(() => {
// this is the teardown function
// will be called in the end
this.messageService.info('Teardown');
});
आपको सदस्यता समाप्त करने की आवश्यकता नहीं है। आपको पता होना चाहिए कि क्या आपके तर्क में कोई समस्याएँ हैं, जो आपकी सदस्यता में समस्याएँ पैदा कर सकती हैं। और उनकी देखभाल करते हैं। ज्यादातर मामलों में, यह एक मुद्दा नहीं होगा, लेकिन ऑटोराइजेशन जैसे महत्वपूर्ण कार्यों में जासूसी करना, आपको अप्रत्याशित व्यवहार का ध्यान रखना चाहिए, "अनसब्सक्राइब" या पाइपिंग या सशर्त कॉलबैक फ़ंक्शंस जैसे अन्य तर्क के साथ इसे मिटाना चाहिए।
हमेशा अनबन क्यों नहीं होती?
कल्पना कीजिए कि आप एक पुट या पोस्ट अनुरोध करते हैं। सर्वर संदेश को किसी भी तरह से पढ़ता है, बस प्रतिक्रिया में कुछ समय लगता है। सदस्यता समाप्त करना, पोस्ट को पूर्ववत नहीं करेगा या डाला नहीं जाएगा। लेकिन जब आप सदस्यता समाप्त कर लेते हैं, तो आपके पास प्रतिक्रिया को संभालने या उपयोगकर्ता को सूचित करने का मौका नहीं होगा, उदाहरण के लिए डायलॉग या टॉयलेट पेपर आदि के माध्यम से।
Wich उपयोगकर्ता को विश्वास करने का कारण बनता है, कि पुट / पोस्ट अनुरोध नहीं किया गया था।
तो यह निर्भर करता है। ऐसे मुद्दों से कैसे निपटना है, यह आपका डिजाइन निर्णय है।