RxJs: вычисление наблюдаемой длины массива в компоненте - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть наблюдаемый массив, purchases$.В моем угловом компоненте 2 я бы хотел вычислить длину массива.Я переживаю, что наблюдаемое никогда не бывает полным, и поэтому мои подписки накапливаются.Если я сделаю следующее, будет ли подписка завершена?

this.purchases$.subscribe((val) => {
  val.length > 0 ? this.purchaseType = 'initial' : this.purchaseType = 'additional'
})

Получив начальное значение, я с радостью отписываюсь.

Можно ли просто добавить .unsubscribe() в конец?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

То, что у вас есть в ваших подписках, не влияет на источник Observable, поэтому, если вы хотите отменить подписку, вам нужно использовать оператор, который завершает цепочку, или отписаться вручную.

Например, если вы знаете, сколько элементовВы хотите принять, что можете использовать take(N) или, если это зависит от определенного условия, вы можете использовать takeWhile().Или вы можете собирать предметы с помощью scan() и комбинировать их, например, с takeWhile().

Вы также можете отказаться от подписки прямо в своем звонке на подписку:

this.purchases$.subscribe(function(val) {
  if (condition) {
    this.unsubscribe();
  }
});

Обратите внимание, что в этом случае вынельзя использовать функции стрелок () => ..., потому что RxJS связывает контекст this с текущим Subscription объектом.Вот почему вы можете позвонить this.unsubscribe() и отказаться от подписки (это не хак, он предназначен для использования таким образом).

0 голосов
/ 25 сентября 2018

Вместо обязательной отписки, я бы рекомендовал использовать первый оператор , чтобы сделать заметку, которая автоматически завершается после выдачи первого результата:

this.purchases$.pipe(first()).subscribe((val) => {
  val.length > 0 ? this.purchaseType = 'initial' : this.purchaseType = 'additiona';
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...