Отписаться в функции обратного вызова подписки? - PullRequest
0 голосов
/ 09 ноября 2018

Я искал простой способ избежать утечек памяти, о которых я читал, из-за отказа от подписки. Большую часть времени я просто хочу получить ОДИН ответ от моего бэкэнда. И тогда я хочу отписаться. Так почему бы не позвонить в обратный вызов?

  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

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Еще один RxJS-иш способ сделать то, что вы хотите, это использовать оператор take, например:

this.puzzleService.login(this.nameoremail, this.password).pipe(
  take(1)
).subscribe(success => {
  // ...
});

Это заставит наблюдаемое излучать ровно одно значение и затем завершит его.

Однако @Picci совершенно прав, что если ваш метод login возвращает результат запроса HttpClient, вам не нужно отписываться вручную (или использовать take, в этом отношении).

0 голосов
/ 09 ноября 2018

Отмена подписки важна во избежание утечек памяти, но, возможно, это не так важно, если вы «просто хотите получить ОДИН ответ от бэкэнда».

Я имею в виду, что если за вашим this.puzzleService.login вы используете службу Angular http, вам не нужно беспокоиться об отмене подписки, поскольку сама служба отписывается, как только получает ответ от бэкэнда, или произошла ошибка.

Отказ от подписки важен, когда вы сталкиваетесь с наблюдаемыми потоками, которые по своей природе испускают более одного значения, и это не относится к вызову http, но может относиться к потокам веб-сокетов или другим видам потоков.

Эта статья Бена Леша , главного автора, если не лидера RxJS, проливает свет на эту тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...