Как однажды подписаться на наблюдаемое? - PullRequest
0 голосов
/ 29 мая 2020

Моя функция access() должна подписываться один раз при каждом вызове.

В приведенном ниже фрагменте $valueChanges передает данные для каждого внесенного изменения. Вызов access() без const $ = ... и $.unsubscribe(), $valueChanges observable испускает ненужные потоки значений.

Есть ли оператор / функция rx js, которая генерируется один раз в подписке внутри функции? Даже если функция вызывается несколько раз, подписка выдает один раз?

access() {
  const $ = $valueChanges.pipe(
    map((res) => 
      ...
    ),
  ).subscribe((res) => {

    ...

    $.unsubscribe();
  });
}

Ответы [ 2 ]

4 голосов
/ 29 мая 2020

Вы можете рассмотреть возможность использования оператора take() и выдать только первое значение перед завершением.

Согласно документации , оператор take

Emit provided number of values before completing.

Вот как его можно использовать:

access() {
  valueChanges
    .pipe(
      map((res) => 
        ...
      ),
      take(1),
    ).subscribe((res) => {

      ...

    });
}
1 голос
/ 29 мая 2020

Попробуйте shareReply(1). Тогда исходный поток будет вызываться только один раз, и его отправка будет доступна всем подписчикам. Если поток выходит второй раз - обновление будет go и для всех подписчиков.

access() {
  const $ = $valueChanges.pipe(
    map((res) => 
      ...
    ),
    // take(1), // in case if you need just 1 emit from it.
    shareReply(1), // in case if you don't want to trigger `$valueChanges` on every subscription.
  ).subscribe((res) => {

    ...

    // $.unsubscribe(); // it's useless in case of `take(1)`.
  });
}
...