web-dev-qa-db-ja.com

ワンタイムサブスクリプションを作成する

Observableへのサブスクリプションを作成する必要がありますが、最初に呼び出されたときにすぐに破棄されます。

次のようなものがありますか?

observable.subscribeOnce(func);

私のユースケースでは、エクスプレスルートハンドラーでサブスクリプションを作成しており、サブスクリプションはリクエストごとに複数回呼び出されています。

126

必要なものについて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);

その理由

232
Brandon

RxJSには、これまで出会った中で最高のドキュメントがあります。以下のリンクをたどると、非常に役立つ表を使用して、ユースケースを演算子にマッピングできます。たとえば、「最初の値を取得したい」ユースケースには、3つの演算子firstfirstOrDefault、およびsampleがあります。

オブザーバブルシーケンスが通知なしで完了した場合、first演算子はサブスクライバーにデフォルト値を提供し、firstOrDefault演算子はエラーをサブスクライバーに通知します。

演算子のユースケース検索

26
DetweilerRyan

@ Brandonの答え を補完するために、BehaviorSubjectに基づいてObservableを更新するには、first()などを使用することも不可欠です。例(未テスト):

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);
  });
0
Andy