先週、私はRxJSに答えました 質問「特定の副作用ごとにサブスクリプションを作成するべきか、それともサブスクリプションを最小限に抑えるべきか」について、別のコミュニティメンバーと話し合いました。完全なリアクティブアプリケーションアプローチの観点からどの方法を使用するか、またはいつ切り替えるかを知りたい。これは私とおそらく他の人たちが不必要な議論を避けるのに役立ちます。
セットアップ情報
- すべての例はTypeScriptにあります
- サブスクリプションのライフサイクル/コンストラクターの使用に関する質問に焦点を当てず、フレームワークを無関係に保つ
- 想像してみてください:サブスクリプションはコンストラクター/ライフサイクルの初期化で追加されます
- 想像してみてください:登録解除はライフサイクル破棄で行われます
副作用とは(角度サンプル)
- UIでの更新/入力(例
value$ | async
) - コンポーネントの出力/アップストリーム(例
@Output event = event$
) - 異なる階層の異なるサービス間の相互作用
使用例:
- 2つの機能:
foo: () => void; bar: (arg: any) => void
- 2つのソースオブザーバブル:
http$: Observable<any>; click$: Observable<void>
foo
がhttp$
発行された後に呼び出され、値は必要ありませんbar
click$
エミット後に呼び出されますが、現在の値が必要ですhttp$
ケース:特定の副作用ごとにサブスクリプションを作成する
const foo$ = http$.pipe(
mapTo(void 0)
);
const bar$ = http$.pipe(
switchMap(httpValue => click$.pipe(
mapTo(httpValue)
)
);
foo$.subscribe(foo);
bar$.subscribe(bar);
ケース:サブスクリプションを最小限に抑える
http$.pipe(
tap(() => foo()),
switchMap(httpValue => click$.pipe(
mapTo(httpValue )
)
).subscribe(bar);
要するに私自身の意見
たとえば、サブスクライバーがパイプにどのように影響するか(たとえば、オブザーバブルを共有するかどうか)を考える必要があるため、サブスクリプションが最初にRxランドスケープをより複雑にするという事実を理解できます。ただし、コードを分離すればするほど(集中するほど、何が起こるか)、将来のコードの保守(テスト、デバッグ、更新)が容易になります。そのことを念頭に置いて、コード内の任意の副作用に対して、常に1つの監視可能なソースと1つのサブスクリプションを作成します。2つ以上の副作用がまったく同じソースオブザーバブルによってトリガーされた場合、オブザーバブルを共有し、ライフサイクルが異なる可能性があるため、各副作用を個別にサブスクライブします。