RXJS - Использование обоих take (1) и takeUntil () - PullRequest
0 голосов
/ 04 июля 2019

После поиска в Интернете я вижу, что люди обычно используют одно или другое, а не оба. Можно ли использовать оба? Это хорошая или плохая практика?

Редактировать

Я не спрашиваю, для чего используется 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();
}

1 Ответ

0 голосов
/ 05 июля 2019

take (1) не гарантирует отмену наблюдаемого, потому что он может не испустить до уничтожения компонента.TakeUntil гарантирует, что наблюдаемое не является утечкой памяти.Если для наблюдения требуется много времени, прежде чем компонент будет уничтожен, и у вас есть только дубль (1), и вы переходите к другому компоненту, подписка все еще прослушивает и сработает, даже если компонент больше не активен.

Единственная причина использования take (1) состоит в том, что если субъект может излучать более одного раза и вам нужно только первое значение, то takUntil достаточно, чтобы убедиться в отсутствии утечки памяти.

...