테스트 후 잠시 동안 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/
이 특정 유형의 Observable은 단일 값 스트림입니다. HTTP 요청이 성공하면이 Observable은 하나의 값만 방출 한 다음 완료됩니다.
그리고 "do i NEED"의 전체 이슈에 대한 답변은 구독을 취소합니까?
때에 따라 다르지.
HTTP 호출 메모리 누출은 문제가되지 않습니다. 문제는 콜백 함수의 논리입니다.
예 : 라우팅 또는 로그인.
전화가 로그인 전화 인 경우 "구독 취소"할 필요는 없지만 사용자가 페이지를 떠날 경우 사용자가없는 경우 응답을 올바르게 처리해야합니다.
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 () 구현에 따라 사용자가 갑자기 다시 라우팅됩니다.
이것은 아닙니다 좋지 .
또한 사용자가 아직 로그인하지 않았다고 믿고 PC를 떠났다고 상상해보십시오. 그러나 논리는 사용자를 로그인하여 보안 문제가 있습니다.
탈퇴하지 않고 무엇을 할 수 있습니까?
보기의 현재 상태에 따라 전화를 겁니다.
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');
})
그러나 구독이 메모리 누수를 일으키지 않는지 어떻게 알 수 있습니까?
"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');
});
구독을 취소 할 필요가 없습니다. 논리에 문제가 있으면 구독에 문제를 일으킬 수 있는지 알아야합니다. 그리고 그들을 돌봐. 대부분의 경우 문제는 아니지만 자동화와 같은 중요한 작업에서는 특히 "구독 취소"또는 파이프 또는 조건부 콜백 함수와 같은 다른 논리를 사용하여 예기치 않은 동작을 처리해야합니다.
왜 항상 구독을 취소하지 않습니까?
풋 또는 포스트 요청을한다고 상상해보십시오. 서버는 메시지를 수신하지만 응답에는 시간이 걸립니다. 구독을 취소하면 게시물을 취소하거나 게시하지 않습니다. 그러나 구독을 취소하면 대화 나 토스트 / 메시지 등을 통해 응답을 처리하거나 사용자에게 알릴 기회가 없습니다.
Wich는 사용자가 풋 / 포스트 요청이 완료되지 않았다고 믿게합니다.
따라서 다릅니다. 이러한 문제를 처리하는 방법은 디자인 결정입니다.