Угловая наблюдаемая подписка может ли она быть отписана в рамках внутренней подписки? - PullRequest
0 голосов
/ 25 сентября 2019

В следующем коде есть таймер и запрос на получение внутри.Если запрос возвращает ошибку, таймер должен остановиться.Можете ли вы остановить таймер в рамках внутренней подписки (т.е. запроса)?Есть потенциальные утечки памяти?Это хорошая практика?

let sub = timer(500, 1000).subscribe(() => {
  this.http.get<any>(url).subscribe(result => {
    //...
  }, error => {
    //...
    sub.unsubscribe();  // can this be done here?
  });
});

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Код, который у вас есть, усложняет очистку / отслеживание всего, так как подписка вызывает другую.

На самом деле вы можете использовать mergeMap, чтобы получить тот же результат (я бы порекомендовал switchMap или concatMapв случае, если запрос занимает больше времени, чем ваш интервал опроса), но также позволяет ошибке распространяться наверх Observable:

let sub = timer(500, 1000).pipe(
  switchMap(_ => this.http.get(url))
).subscribe(result => {
  ...
}, error => {
    // sub is already unsubscribed at this point since there was an error
});

Чтобы ответить на вопрос:

Что касается утечек памяти, вашоригинальный код должен быть в порядке, если let sub совпадает с this.sub.

1 голос
/ 25 сентября 2019
  • Can you stop the timer within the inner subscription

Да, вы можете.

  • Any potential memory leaks

Ничего больше, чем отписаться в вашем ngOnDestroy.Не могу говорить за остальную часть вашего кода, поэтому я не скажу «да» или «нет».

  • Is it a good practice

Это ни хорошо, ни плохо, здесь просто код.Я не думаю, что у вас есть другое решение, кроме, возможно, веб-сокета для упрощения кода, но это все.

...