Sau một thời gian thử nghiệm, đọc tài liệu và mã nguồn của 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/
Unularisty góc: https://blog.angular-university.io/angular-http/
Loại Quan sát cụ thể này là các luồng giá trị đơn: Nếu yêu cầu HTTP thành công, các quan sát này sẽ chỉ phát ra một giá trị và sau đó hoàn tất
Và câu trả lời cho toàn bộ Vấn đề "tôi có CẦN" để hủy đăng ký không?
Nó phụ thuộc.
Cuộc gọi http không phải là một vấn đề. Các vấn đề là logic trong các chức năng gọi lại của bạn.
Ví dụ: Định tuyến hoặc Đăng nhập.
Nếu cuộc gọi của bạn là cuộc gọi đăng nhập, bạn không phải "hủy đăng ký" nhưng bạn cần đảm bảo nếu Người dùng rời khỏi trang, bạn sẽ xử lý phản hồi đúng cách nếu không có người dùng.
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');
})
Từ khó chịu đến nguy hiểm
Bây giờ chỉ cần tưởng tượng, mạng chậm hơn bình thường, cuộc gọi mất nhiều thời gian hơn 5 giây và người dùng rời khỏi chế độ xem đăng nhập và chuyển đến "chế độ xem hỗ trợ".
Các thành phần có thể không hoạt động nhưng đăng ký. Trong trường hợp có phản hồi, người dùng sẽ đột nhiên được định tuyến lại (tùy thuộc vào việc triển khai xử lýResponse () của bạn).
Điều này là không tốt.
Cũng chỉ cần tưởng tượng người dùng rời khỏi máy tính, tin rằng anh ta chưa đăng nhập. Nhưng logic của bạn đăng nhập người dùng, bây giờ bạn có một vấn đề bảo mật.
Bạn có thể làm gì mà KHÔNG hủy đăng ký?
Làm cho bạn gọi phụ thuộc vào trạng thái hiện tại của chế độ xem:
public isActive = false;
public ngOnInit(): void {
this.isActive = true;
}
public ngOnDestroy(): void {
this.isActive = false;
}
Người dùng .pipe(takeWhile(value => this.isActive))
để đảm bảo phản hồi chỉ được xử lý khi chế độ xem được kích hoạt.
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');
})
Nhưng làm thế nào bạn có thể chắc chắn rằng thuê bao không gây ra hiện tượng nhớ?
Bạn có thể đăng nhập nếu "torndownLogic" được áp dụng.
RipdownLogic của một thuê bao sẽ được gọi khi đăng ký trống hoặc không đăng ký.
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');
});
Bạn không cần phải hủy đăng ký. Bạn nên biết nếu có vấn đề trong logic của bạn, điều đó có thể gây ra Sự cố trong đăng ký của bạn. Và chăm sóc chúng. Trong hầu hết các trường hợp, nó sẽ không phải là một vấn đề, nhưng đặc biệt ở các nhiệm vụ quan trọng như tự động hóa, bạn nên quan tâm đến hành vi không mong muốn, bằng cách "hủy đăng ký" hoặc logic khác như chức năng gọi lại có điều kiện hoặc đường ống có điều kiện.
Tại sao không luôn luôn hủy đăng ký?
Hãy tưởng tượng bạn thực hiện một yêu cầu đặt hoặc gửi. Máy chủ nhận tin nhắn theo bất kỳ cách nào, chỉ cần phản hồi mất một lúc. Hủy đăng ký, sẽ không hoàn tác bài đăng hoặc đặt. Nhưng khi bạn hủy đăng ký, bạn sẽ không có cơ hội xử lý phản hồi hoặc thông báo cho Người dùng, ví dụ như qua Hộp thoại hoặc Toast / Tin nhắn, v.v.
Việc này khiến Người dùng tin rằng yêu cầu đặt / đăng không được thực hiện.
Vì vậy, nó phụ thuộc. Đó là quyết định thiết kế của bạn, làm thế nào để đối phó với các vấn đề như vậy.