Я искал простой способ избежать утечек памяти, о которых я читал, из-за отказа от подписки. Большую часть времени я просто хочу получить ОДИН ответ от моего бэкэнда. И тогда я хочу отписаться. Так почему бы не позвонить в обратный вызов?
onSubmit(){
var subscription = this.puzzleService.login(this.nameoremail, this.password).subscribe( success =>{
if(success){
this.router.navigate(['/puzzles']);
}
else{
this.message="Login failed. Please try again.";
}
this.loading=false;
subscription.unsubscribe();
});
this.loading=true;
}
Обратите внимание на присвоение подписки локальной переменной. Затем эта локальная переменная блокируется внутри замыкания и получает указание отписаться, когда ее работа завершена. Нет переменных класса, нет takeUntil, больше ничего.
Он компилируется и запускается без ошибок. Я недостаточно знаком с отладчиком, чтобы определить, действительно ли наблюдаемый объект уничтожен и впоследствии собран мусором.
Есть что-то, что я пропускаю? Может ли кто-нибудь более знакомый с отладчиком поправить меня? Потому что, если это сработает, я буду делать это везде. Кроме как в моей функции pollWords () ...
Это кажется намного проще, чем другие решения, которые я видел, за которые выступал. Я думаю, что мне даже не нужно закрытие, так как, когда я смотрю на него в отладчике, я вижу, что «_this» - это закрытие для «this», а «this» - фактически наблюдаемое. Так что, если бы был какой-то способ предотвратить обман, который происходит с «этим», то я мог бы вызвать «this.unsubscribe ()» и все было бы готово. Не то, чтобы закрытие ссылки на объект было ужасной вещью ...
Ссылки:
Angular / RxJs Когда мне следует отписаться от `Subscription`
Наблюдаемый жизненный цикл Rxjs