Bir süre test ettikten sonra, belgeleri ve HttpClient'in kaynak kodunu okuyun.
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/
Açısal Üniversite: https://blog.angular-university.io/angular-http/
Bu tür Gözlemlenebilir türler tek değerli akışlardır: HTTP isteği başarılı olursa, bu gözlemlenebilirler yalnızca bir değer yayar ve sonra tamamlanır
Ve abonelikten çıkmak için tüm "Soruna ihtiyacım var" sorununun cevabı?
Değişir.
Http çağrısı Memoryleaks bir sorun değil. Sorunlar geri arama işlevlerinizdeki mantıktır.
Örneğin: Yönlendirme veya Giriş.
Aramanız bir giriş aramasıysa, "abonelikten çıkmanız" gerekmez, ancak Kullanıcının sayfadan ayrılıp ayrılmadığından emin olmanız gerekir; kullanıcının yokluğunda yanıtı doğru şekilde ele alırsınız.
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');
})
Can sıkıcıdan tehlikeye
Şunu hayal edin, şebeke normalden daha yavaş, çağrı 5 saniye daha uzun sürüyor ve kullanıcı giriş görünümünden ayrılıyor ve bir "destek görünümüne" gidiyor.
Bileşen etkin olmayabilir, ancak abonelik olabilir. Bir yanıt durumunda, kullanıcı aniden yeniden yönlendirilir (handleResponse () uygulamanıza bağlı olarak).
Bu değil iyi .
Ayrıca, kullanıcının henüz giriş yapmadığına inanarak bilgisayardan ayrıldığını hayal edin. Ancak mantık, kullanıcının oturum açmasını sağlar, şimdi bir güvenlik sorununuz var.
Aboneliği iptal etmeden ne yapabilirsiniz?
Aramayı, görünümün mevcut durumuna bağlı yapın:
public isActive = false;
public ngOnInit(): void {
this.isActive = true;
}
public ngOnDestroy(): void {
this.isActive = false;
}
.pipe(takeWhile(value => this.isActive))
Yanıtın yalnızca görünüm etkin olduğunda işlendiğinden emin olmak için kullanıcı .
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');
})
Ancak aboneliğin memoryleaks'e neden olmadığından nasıl emin olabilirsiniz?
"TeardownLogic" uygulanırsa oturum açabilirsiniz.
Bir aboneliğin teardownLogic öğesi, alt yazı boş olduğunda veya abonelikten çıkarıldığında çağrılır.
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');
});
Aboneliği iptal etmek zorunda değilsiniz. Mantığınızda aboneliğinizde sorunlara neden olabilecek sorunlar olup olmadığını bilmelisiniz. Ve onlara iyi bak. Çoğu durumda, bu bir sorun olmayacak, ancak otorizasyon gibi kritik görevlerde özellikle, "abonelikten çıkma" veya borulama veya koşullu geri arama işlevleri gibi başka bir mantık olsun, beklenmedik davranışlarla ilgilenmelisiniz.
neden her zaman abonelikten çıkmıyorsunuz?
Koy ya da posta isteğinde bulunduğunuzu düşünün. Sunucu her iki şekilde de iletiyi alır, yalnızca yanıt biraz zaman alır. Aboneliği iptal etmek, yayını geri almaz veya koymaz. Ancak abonelikten çıktığınızda, yanıtı ele alma veya Kullanıcıyı, örneğin İletişim Kutusu veya Tost / Mesaj vb. Yoluyla bilgilendirme şansınız olmaz.
Kullanıcının put / post isteğinin yapılmadığına inanmasına neden olur.
Yani değişir. Tasarım kararınız, bu tür sorunlarla nasıl başa çıkacağınız.