Создание одноразовой подписки

Мне нужно создать подписку на Observable которая немедленно утилизируется при первом вызове.

Есть что-то вроде:

observable.subscribeOnce(func);

В моем случае использования я создаю подписку в обработчике экспресс-маршрута, и подписка вызывается несколько раз за запрос.

Ответ 1

Не на 100% уверен в том, что вам нужно, но если вы хотите наблюдать только первое значение, используйте либо first(), либо take(1):

observable.first().subscribe(func);

примечание: .take(1) и .first() оба автоматически отписываются, когда их условие выполнено

Обновление от RxJS 5. 5+

Из комментария Coderer.

import { first } from 'rxjs/operators'

observable
  .pipe(first())
  .subscribe(func);

Вот почему

Ответ 2

RxJS имеет некоторые из лучших документов, которые я когда-либо встречал. Следуя ссылке ниже, вы перейдете к чрезвычайно полезным вариантам использования таблиц для операторов. Например, в разделе "Я хочу использовать первое значение" используются три оператора: first, firstOrDefault и sample.

Обратите внимание, что если наблюдаемая последовательность завершается без уведомлений, оператор first уведомляет абонентов об ошибке, а оператор firstOrDefault предоставляет значение по умолчанию для подписчиков.

поиск примера использования оператора

Ответ 3

В дополнение к ответу @Brandon использование first() и т.п. Также необходимо для обновления BehaviorSubject на основе его Observable. Например (не проверено):

var subject = new BehaviorSubject({1:'apple',2:'banana'});
var observable = subject.asObservable();

observable
  .pipe(
    first(), // <-- Ensures no stack overflow
    flatMap(function(obj) {
      obj[3] = 'pear';
      return of(obj);
    })
  )
  .subscribe(function(obj) {
    subject.next(obj);
  });