Не обязательно, что ngOnDestroy
вызывается до получения последнего значения из наблюдаемого.
Это зависит от логики или времени, необходимого для выполнения операции.В вашем случае logout
требуется еще некоторое время, и, прежде чем он будет завершен, вызывается ngOnDestroy
и ваша подписка уничтожается.
Например, рассмотрим код здесь stackblitz ,Если вы видите в файле test.service.ts , я создал 2 функции, как показано ниже:
...
nextValueDelayed(value: boolean) {
setTimeout(() => {
this._test.next(value);
});
}
nextValue(value: boolean) {
this._test.next(value);
}
...
Теперь из app.component.ts , яя звоню так же, как показано ниже:
...
reverse() {
this.visible = !this.visible;
this._testService.nextValue(this.visible);
}
reverseDelayed() {
this.visible = !this.visible;
this._testService.nextValueDelayed(this.visible);
}
...
Обе функции вызываются с кнопок, а visible
отвечает за создание и уничтожение HelloComponent
. app.component.html
<hello name="{{ name }}" *ngIf="visible"></hello>
<button (click)="reverse()">Reverse</button>
<button (click)="reverseDelayed()">Reverse Delayed</button>
Теперь HelloComponent
подписывается и утешает значение, а также отписывается при уничтожении, как показано ниже: hello.component.ts
...
ngOnInit(){
this.sub = this._testService.test$.subscribe(value=>{
console.log(value);
})
}
ngOnDestroy(){
this.sub.unsubscribe();
}
...
Теперь попробуйте нажать кнопки Reverse
и Reverse Delayed
, и вы увидите, что при нажатии на Reverse
будут напечатаны все значения.Но когда вы нажимаете Reverse Delayed
, компонент будет уничтожен до получения последнего значения, потому что мы использовали setTimeout
для добавления некоторой задержки.