web-dev-qa-db-ja.com

RxJS-一度だけサブスクライブしますが、Observableは完了しません

リアルタイムで変化するデータを含むObservableがある状況を想像してください。以下の例...

interface User {
   name: string;
   projectId: string;
   dataThatChangesALotInRealTime: Object;
}

userData: Observable<User>

このuserDataオブザーバブルは、リアルタイムで変化するデータを表示するためにコンポーネントで使用されます。例えば.

<p>
{{ (userData | async)?.dataThatChangesALotInRealTime }}
</p>

次に、userDataオブザーバブルの現在のデータに従って、データベースにデータを挿入します。ここに機能があります

addToDatabase() {
  let sub = this.userData.subscribe(data => {
     this.exampleDatabase.doc(`test/${data.dataThatChangesALotInRealTime.id}`)
          .add({ test: 'hello'})
     sub.unsubscribe() // <- This
  })
}

質問

これは、データベースへの複数の挿入を回避するためにサブスクリプション内でサブスクリプションを解除する正しいソリューションですか?これを行う別の/より良い方法はありますか?

これは最小限の例です。質問がある場合や、説明が不十分な場合は、コメントでお知らせください。質問を更新します。ありがとうございました

10
Raold

first演算子を使用できます。

_this.userData.pipe(first()).subscribe(...);
_

これは、最初の値が発行された後で自動的に完了します(したがって、サブスクライブ解除されます)。

完了しないとエラーがスローされるため、完了する前に少なくとも1回は発行するようにしてください。これを確認できない場合は、代わりにtake(1)を使用できます。

_this.userData.pipe(take(1)).subscribe(...);
_

これは実際にuserDataオブザーバブルを直接変更するわけではないため、他のサブスクリプションはそれに関係なくエミッションを継続します。これは、rxjsの演算子はオブザーバブルを変更せず、代わりに新しいオブザーバブルを返すためです。

14
Ingo Bürk