Есть несколько способов отказаться от подписки на наблюдаемые компоненты Angular (с помощью ngOnDestroy). Какой из перечисленных ниже вариантов следует предпочесть и почему (например, по техническим причинам, характеристикам и т. Д.)?
Вариант 1: takeUntil
Использование RxJS takeUntil для отказа от подписки
@Component({
selector: "app-flights",
templateUrl: "./flights.component.html"
})
export class FlightsComponent implements OnDestroy, OnInit {
private readonly destroy$ = new Subject();
public flights: FlightModel[];
constructor(private readonly flightService: FlightService) {}
ngOnInit() {
this.flightService
.getAll()
.pipe(takeUntil(this.destroy$))
.subscribe(flights => (this.flights = flights));
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
}
Вариант 2: .unsubscribe ()
Явный вызов .unsubscribe (), например с помощью отдельного экземпляра подписки
@Component({
selector: "app-flights",
templateUrl: "./flights.component.html"
})
export class FlightsComponent implements OnDestroy, OnInit {
private readonly subscriptions = new Subscription();
public flights: FlightModel[];
constructor(private readonly flightService: FlightService) {}
ngOnInit() {
const subscription = this.flightService
.getAll()
.subscribe(flights => (this.flights = flights));
this.subscriptions.add(subscription);
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
}
Вариант 3: взять
Использование RxJS takeWhile при отказе от подписки