Setelah beberapa saat pengujian, baca dokumentasi dan kode sumber 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/
Universitas Angular: https://blog.angular-university.io/angular-http/
Jenis Observable khusus ini adalah aliran bernilai tunggal: Jika permintaan HTTP berhasil, observable ini hanya akan memancarkan satu nilai dan kemudian menyelesaikan
Dan jawaban untuk seluruh Masalah "apakah saya MEMBUTUHKAN" untuk berhenti berlangganan?
Tergantung.
Http call Memoryleaks tidak menjadi masalah. Masalahnya adalah logika dalam fungsi panggilan balik Anda.
Misalnya: Routing atau Login.
Jika panggilan Anda adalah panggilan masuk, Anda tidak perlu "berhenti berlangganan" tetapi Anda harus memastikan jika Pengguna meninggalkan halaman, Anda menangani respons dengan benar tanpa adanya pengguna.
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');
})
Dari menjengkelkan menjadi berbahaya
Sekarang bayangkan saja, jaringan lebih lambat dari biasanya, panggilan membutuhkan waktu lebih lama 5 detik, dan pengguna meninggalkan tampilan login dan pergi ke "tampilan dukungan".
Komponen mungkin tidak aktif tetapi berlangganan. Jika ada respons, pengguna akan tiba-tiba dialihkan (tergantung implementasi handleResponse () Anda).
Ini bukan baik.
Bayangkan saja pengguna meninggalkan pc, percaya dia belum login. Tapi Anda masuk log logis pengguna, sekarang Anda memiliki masalah keamanan.
Apa yang dapat Anda lakukan TANPA berhenti berlangganan?
Membuat panggilan Anda tergantung pada kondisi tampilan saat ini:
public isActive = false;
public ngOnInit(): void {
this.isActive = true;
}
public ngOnDestroy(): void {
this.isActive = false;
}
Pengguna .pipe(takeWhile(value => this.isActive))
untuk memastikan respons hanya ditangani ketika tampilan aktif.
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');
})
Tetapi bagaimana Anda bisa yakin bahwa langganan tidak menyebabkan kebocoran memori?
Anda dapat login jika "teardownLogic" diterapkan.
The teardownLogic dari suatu langganan akan dipanggil ketika subkripsi kosong atau berhenti berlangganan.
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');
});
Anda tidak harus berhenti berlangganan. Anda harus tahu jika ada masalah dalam logika Anda, yang dapat menyebabkan Masalah dalam langganan Anda. Dan urus mereka. Dalam kebanyakan kasus, itu tidak akan menjadi masalah, tetapi terutama pada tugas-tugas penting seperti autorisasi, Anda harus menjaga perilaku yang tidak terduga, apakah itu dengan "berhenti berlangganan" atau logika lain seperti pemipaan atau fungsi panggilan balik bersyarat.
mengapa tidak selalu berhenti berlangganan saja?
Bayangkan Anda membuat permintaan put atau postingan. Server menerima pesan dengan cara apa pun, hanya tanggapannya yang membutuhkan waktu. Berhenti berlangganan, tidak akan membatalkan pos atau menempatkan. Tetapi ketika Anda berhenti berlangganan, Anda tidak akan memiliki kesempatan untuk menangani respons atau menginformasikan Pengguna, misalnya melalui Dialog atau Toast / Pesan dll.
Wich menyebabkan Pengguna percaya, bahwa permintaan put / post tidak dilakukan.
Jadi itu tergantung. Ini adalah keputusan desain Anda, bagaimana menangani masalah seperti itu.