Отказ от подписки на вызов HTTP-клиента в хуке OnDestroy службы Angular

Есть ли способ отписаться от http-вызова службы angular onDestroy.

P.S. Мне известно об операторе «взять» rxjs или об отказе от подписки на службу из самого компонента.

    import { HttpClient } from "@angular/common/http";
import { Injectable, OnDestroy } from "@angular/core";

@Injectable()
export class SampleService implements OnDestroy {
  constructor(private httpClient: HttpClient) {}

  getSampleData() {
    return this.httpClient.get("https://jsonplaceholder.typicode.com/todos/1");
  }
  ngOnDestroy(): void {
    // automatically unsubscribe to service.
  }
}

person varunduttsharma7    schedule 28.04.2021    source источник
comment
Отвечает ли это на ваш вопрос? Нужно ли отписываться от наблюдаемых, созданных Http методы?   -  person R. Richards    schedule 28.04.2021
comment
@R.Richards Спасибо за ссылку. Но когда экземпляр службы уничтожается вместе с компонентом, можем ли мы написать некоторую логику очистки, чтобы проверить, нужно ли отписываться от какого-либо http-вызова??   -  person varunduttsharma7    schedule 28.04.2021


Ответы (1)


У сервисов нет жизненного цикла, управляемого пользовательским интерфейсом, и, следовательно, независимо от того, насколько вы реализуете onDestroy, он никогда не будет вызываться, если вы не вызовете его вручную.

Вот почему у нас есть инструменты, читай API, такие как:

<div> {{ yourObservable$ | async | json }} </div>
@Component({...})
export class Component implements OnInit {
   yourObservable$: Observable<any>
   constructor(public yourService: TheService) {
       this.yourObservable$ = this.yourService.getSampleData()
   }
}

Асинхронный канал замечает изменения жизненного цикла и автоматически подписывается и отменяет подписку всякий раз, когда компонент удаляется.

  • Подписка (которую вы можете добавить к другим подпискам, вызвав .add) и при вызове onDestroy вашего компонента subscription.unsubscribe()

Subscription.unsubscribe — это то, на чем построен асинхронный канал, и вы также можете использовать его самостоятельно.

person Some random IT boy    schedule 28.04.2021
comment
Но мы видим, что экземпляр службы angular, не являющийся синглтоном, вызовет ngOndestroy этой службы, когда компонент, предоставляющий экземпляр, будет уничтожен? Я ищу какой-то способ проверить, есть ли еще подписчики для http-вызова. - person varunduttsharma7; 28.04.2021
comment
Обычно, когда имеешь дело с такими вещами: есть одно золотое правило, которое работает фантастически, и в значительной степени то, как язык программирования C управляет этим: если вы собираетесь готовить на кухне, оставьте все как есть, как только закончите. . Итак, если компонент подписывается, то он должен отвечать за отписку. Если вы оставите подписки открытыми, у вас будет утечка памяти и потеря производительности (поскольку браузер будет занят выполнением бесполезного кода подписки). - person Some random IT boy; 29.04.2021
comment
Если вы хотите выполнить некоторую очистку на стороне службы, когда компонент будет уничтожен, вы можете вызвать service.onDestroy() из компонента; но будьте осторожны; экземпляр службы может быть общим, и если вы делаете опасные вещи, вы можете испортить состояние других компонентов. Я настоятельно рекомендую вам придерживаться трубы async - person Some random IT boy; 29.04.2021