หลังจากผ่านไปสักพักการอ่านเอกสารและซอร์สโค้ดของ 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/
Observables ประเภทนี้เป็นกระแสเดี่ยวค่า: ถ้าการร้องขอ HTTP สำเร็จ, observables เหล่านี้จะปล่อยเพียงหนึ่งค่าแล้วเสร็จ
และคำตอบของปัญหาทั้งหมดของ "ฉันต้อง" เพื่อยกเลิกการสมัครหรือไม่?
มันขึ้นอยู่กับ.
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 วินาทีและผู้ใช้ออกจากมุมมองการเข้าสู่ระบบและไปที่ "มุมมองการสนับสนุน"
องค์ประกอบอาจไม่ทำงาน แต่เป็นการสมัครสมาชิก ในกรณีของการตอบสนองผู้ใช้จะถูกเปลี่ยนเส้นทางทันที (ขึ้นอยู่กับการใช้งาน handleResponse () ของคุณ)
มันไม่ดี
เพียงแค่จินตนาการว่าผู้ใช้ออกจากพีซีโดยเชื่อว่าเขายังไม่ได้เข้าสู่ระบบ แต่ตรรกะคุณบันทึกผู้ใช้ในตอนนี้คุณมีปัญหาด้านความปลอดภัย
คุณสามารถทำอะไรโดยไม่ยกเลิกการเป็นสมาชิก?
ทำให้คุณโทรขึ้นอยู่กับสถานะปัจจุบันของมุมมอง:
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');
})
แต่คุณจะแน่ใจได้อย่างไรว่าการสมัครสมาชิกนั้นไม่ทำให้เกิด memoryleaks?
คุณสามารถเข้าสู่ระบบได้หากมีการใช้ "teardownLogic"
teardownLogic ของการสมัครสมาชิกจะถูกเรียกเมื่อการสมัครสมาชิกว่างเปล่าหรือยกเลิกการเป็นสมาชิก
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');
});
คุณไม่จำเป็นต้องยกเลิกการสมัคร คุณควรทราบว่ามีปัญหาในตรรกะของคุณหรือไม่ที่อาจทำให้เกิดปัญหาในการสมัครสมาชิกของคุณ และดูแลพวกเขา ในกรณีส่วนใหญ่มันจะไม่เป็นปัญหา แต่โดยเฉพาะอย่างยิ่งในงานที่สำคัญเช่นการทำให้เป็นอัตโนมัติคุณควรดูแลพฤติกรรมที่ไม่คาดคิดด้วยการ "ยกเลิกการเป็นสมาชิก" หรือตรรกะอื่น ๆ เช่นการวางท่อหรือฟังก์ชันการโทรกลับตามเงื่อนไข
ทำไมไม่ยกเลิกการเป็นสมาชิกตลอดเวลา?
ลองนึกภาพคุณใส่คำขอหรือโพสต์ เซิร์ฟเวอร์จะรับข้อความด้วยวิธีใด ๆ การตอบสนองจะใช้เวลาสักครู่ ยกเลิกการสมัครจะไม่ยกเลิกการโพสต์หรือใส่ แต่เมื่อคุณยกเลิกการเป็นสมาชิกคุณจะไม่มีโอกาสจัดการกับคำตอบหรือแจ้งผู้ใช้ตัวอย่างเช่นผ่านกล่องโต้ตอบหรือขนมปังปิ้ง / ข้อความเป็นต้น
ซึ่งทำให้ผู้ใช้เชื่อว่าคำขอวาง / โพสต์ไม่ได้ทำ
ดังนั้นมันขึ้นอยู่กับ เป็นการตัดสินใจออกแบบของคุณวิธีจัดการกับปัญหาดังกล่าว