1. ホーム
  2. javascript

[解決済み】AngularのSubjectとBehaviorSubjectとReplaySubjectの比較

2022-04-12 20:46:43

質問

この3つを理解するために探していました。

私はそれらを使って、いつ、なぜ、どんなメリットがあるのかを知りたいのですが、ドキュメントを読んだり、チュートリアルを見たり、グーグルで検索したりしてみたものの、これといった意味を見出せずにいます。

では、その目的は何なのでしょうか?実際の事例があれば、コードでなくてもいいので教えてください。

単に "a+b => c you are subscribed to ..." といった説明ではなく、すっきりとした説明が欲しいです。

ありがとうございました。

解決方法は?

結局のところ、動作とセマンティックスの問題なのです。を使用すると

  • Subject - サブスクライバーは、発行されたパブリッシュされた値のみを取得します。 サブスクリプションを作成します。自問自答してみてください、それはあなたが望むことですか?サブスクライバーは以前の値について何か知る必要がありますか?もしそうでなければ、これを使うことができますし、そうでなければ他のものを選んでください。例えば、コンポーネント間の通信の場合。例えば、ボタンをクリックすると、他のコンポーネントにイベントを発行するコンポーネントがあるとする。通信には、主語があるサービスを使うことができます。

  • BehaviorSubject - の場合、最後の値がキャッシュされます。サブスクライバーは最初のサブスクリプションの際に最新の値を取得します。このサブジェクトのセマンティクスは、時間の経過とともに変化する値を表すことである。例えば、ログインしているユーザー。最初のユーザーは匿名ユーザーかもしれない。しかし、一旦ユーザーがログインすると、新しい値は認証されたユーザーの状態になります。

    は、その BehaviorSubject は初期値で初期化されます。これは、コーディングの好みに応じて重要な場合があります。例えば、これを null . それから、サブスクリプションで、NULLチェックを行う必要があります。多分OKか、それとも迷惑か。

  • ReplaySubject - は、指定された排出数までキャッシュすることができます。サブスクライバーは、サブスクリプション時にキャッシュされたすべての値を取得します。この動作はいつ必要になるのでしょうか?正直なところ、次のようなケースを除いては、このような動作が必要になったことはありません。

    を初期化した場合 ReplaySubject というバッファサイズを持つ 1 であれば、実際に 動作 と同じように BehaviorSubject . 最後の値は常にキャッシュされるため、時間と共に値が変化するように動作します。これによって null のようにチェックします。 BehaviorSubject で初期化された null . この例では、最初のパブリッシングまで、サブスクライバーに値が発行されることはありません。

つまり、(どちらを使うかは)あなたが期待する動作によるということです。ほとんどの場合、あなたはおそらく BehaviorSubject なぜなら、あなたが本当に表現したいのは、quot;value over time"というセマンティックなものだからです。しかし、私は個人的には ReplaySubject で初期化された 1 .

したいこと 避ける は、バニラの Subject 本当に必要なのはキャッシュの動作なのに。例えば、ルーティングガードやリゾルブを書いているとします。このガードでデータを取得し、それをサービスの Subject . そして、ルーティングされたコンポーネントでサービスサブジェクトを購読し、ガードで発行されたその値を取得しようとする。OOPs 値はどこだ?もう発行されてるんだよ、デュフフ。キャッシュ機能を使ってください。

こちらもご覧ください。