После поиска в Интернете я вижу, что люди обычно используют одно или другое, а не оба. Можно ли использовать оба? Это хорошая или плохая практика?
Редактировать
Я не спрашиваю, для чего используется take (1) или takeUntil. Скорее я спрашиваю, возможно ли иметь оба эффекта take (1) и takeUntil. Я понимаю, что take (1) примет только первое значение и завершит подписку. Тем не менее, это не прекратит подписку, если я никогда не получу событие. Я также понимаю, что это использование takeUntil всегда будет очищать подписку, когда компонент больше не активен, пока я запускаю unsubscribeSubject в уничтожении. Однако эта подписка не освобождает эту подписку после получения первого значения и будет существовать в течение всего времени, когда компонент активен.
Мне нужен способ освободить подписку после первого значения, а также предотвратить утечки памяти, когда компонент больше не активен, если не получено значение. В частности, в сценарии, где у вас много подписок. Это связано с тем, что когда у вас много подписок, удобно иметь одну тему, которая может очистить все ваши подписки, когда компонент больше не нужен.
ngAfterViewInit(){
//if first value comes, we process it and unsubscribe
this.myService.GetOneTimeObservable()
.pipe(take(1))
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(this.fooOT.bind(this))
//other subscriptions (assume many)
this.myService.GetLongLifeObservable1()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(this.foo1.bind(this))
this.myService.GetLongLifeObservable2()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(this.foo2.bind(this))
this.myService.GetLongLifeObservable3()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(this.foo3.bind(this))
}
ngOnDestroy(){
//Ideally cleans all subscriptions, including the OneTime if no value is received
this.unsubscribeSubject.next();
this.unsubscribeSubject.complete();
}