しばらくテストした後、ドキュメントと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/
Angular Univeristy:https : //blog.angular-university.io/angular-http/
この特定のタイプのオブザーバブルは単一値ストリームです。HTTPリクエストが成功した場合、これらのオブザーバブルは1つの値のみを発行してから完了します。
そして、解約するには「do i NEED」の問題全体に対する答えは?
場合によります。
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()の実装によって異なります)。
これは良くない。
また、ユーザーがまだ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');
});
退会する必要はありません。ロジックに問題があり、サブスクリプションで問題が発生する可能性があるかどうかを確認する必要があります。そして、それらの世話をします。ほとんどの場合、それは問題にはなりませんが、特に自動化などの重要なタスクでは、「サブスクライブ解除」またはパイプ処理や条件付きコールバック関数などの他のロジックを使用して、予期しない動作に注意する必要があります。
なぜいつも退会しないのですか?
putまたはpostリクエストを行うと想像してください。サーバーはどちらの方法でもメッセージを受信しますが、応答だけにしばらく時間がかかります。登録を解除すると、投稿の取り消しや投稿は行われません。ただし、退会すると、たとえばダイアログやトースト/メッセージなどを介して、応答を処理したり、ユーザーに通知したりすることができなくなります。
Wichは、ユーザーにput / postリクエストが実行されなかったと信じ込ませます。
したがって、状況によって異なります。そのような問題にどのように対処するかは、あなたの設計上の決定です。