У меня вопрос об одном из распространенных шаблонов отказа от подписки с оператором takeUntil для Angular и RxJs. В этой статье, это под третьей позицией. Например, у нас есть такой код в классе компонента:
private destroy$: Subject<boolean> = new Subject();
ngOnInit() {
this.control.
.pipe(takeUntil(this.destroy$)
.subscribe(doSmthngFunc);
}
ngOnDestroy() {
this.destroy$.next(true);
// Which next line of code is correct?
// this.destroy$.complete() // this one?
// this.destroy$.unsubscribe() // or this one?
}
Первая строка this.destroy $ .next (true) полностью понятна. Но второго нет. Если мы посмотрим на реализацию этих методов, мы обнаружим, что они имеют несколько схожее поведение. complete (): отказаться от подписки ():
Насколько я понимаю, семантически complete () предпочтительнее, потому что мы вызываем next () в первый и последний раз в течение жизненного цикла компонента, а затем мы закончили с этим Subject, который рассматривается как Observable и может вызывать complete (). Эти методы принадлежат наблюдателю, а метод отказа от подписки принадлежит наблюдаемому, и у нас нет подписок, от которых можно отказаться. Но под капотом эти методы имеют похожий код:
this.isStopped = true; // both
this.observers.length = 0; // complete
this.observers = null; // unsubscribe
this.closed = true; // only unsubscribe
Теоретически complete () имеет отложенный эффект, поскольку он может вызывать complete () для каждого подписанного наблюдателя, но у нас нет наблюдателей на destroy $. Итак, вопрос - какой способ предпочтительнее, менее подвержен ошибкам и почему?
Which next line of code is correct?
избыточны. Требуется толькоthis.destroy$.next(true);
. ОператорtakeUntil
является единственным подписчиком на темуdestroy$
, и он откажется от подписки, как толькоdestroy$
отправитnext
уведомление. Ниcomplete
, ниunsubscribe
вызывать не нужно. И вы почти никогда не хотите звонитьunsubscribe
по теме - см. blog.angularindepth.com/ rxjs-closed-themes-1b6f76c1b63c - person cartant   schedule 06.07.2019but we have no observers on destroy$
каждый раз, когда вы используетеtakeUntil()
, добавляется наблюдатель. Наблюдатели - это вещи, которые слушают. Я думаю, вы неправильно поняли этот термин. - person Reactgular   schedule 06.07.2019