使用時RXJSサブジェクト、BehaviorSubject、ReplaySubject、AsyncSubject、または角度の空の件名
このポストでは、それらのタイプのものが何であるか、そして、あなたがそれらを使うべきであるかに深く潜りたいです.ので、バックルと乗り心地をお楽しみください.
目次
主題は何か
rxjsは角度での反応性の原因である.主題はRXJSライブラリから観測可能な特定のタイプです.
If you don't know what an Observable is, check this post by "Understanding RxJS Observables and why you need them" on the LogRocket blog.
ユニキャスト
観測可能なユニキャスト.
観測者とその加入者は1対1の関係を有する.各購読オブザーバはオブザーバブルの独立した実行を所有します.
マルチキャスト
定期的に観測可能であると比較して、被験者は多くの観測者に値をマルチキャストすることができます.被験者とその加入者は1対多の関係を有する.
被験者は観察者と同様に観察できる.彼らは多くのリスナーのレジストリを複数のオブザーバブルに保持します.
コードで観察可能な対主題
観測可能と対象はAPIを共有する.どちらも同じ方法とどのようにそれらを作成します.しかし、彼らは非常に異なって振る舞う.
コードで見る
import { Observable } from "rxjs"
const observable = new Observable(subscriber => {
subscriber.next(1);
subscriber.next(2);
subscriber.next(3);
subscriber.complete();
});
console.log('just before subscribe');
// Subscriber 1
observable.subscribe({
next(x) { console.log('sub1: got value ' + x); },
error(err) { console.error('sub1: something wrong occurred: ' + err); },
complete() { console.log('sub1: done'); }
});
// Subscriber 2
observable.subscribe({
next(x) { console.log('sub2: got value ' + x); },
error(err) { console.error('sub2: something wrong occurred: ' + err); },
complete() { console.log('sub2: done'); }
});
console.log('just after subscribe');
Working example ここでは、データが最初の加入者に送られ、次の加入者に続く前に終了することがわかります.
In the RxJS documentation, they are describing that "Each call to
observable.subscribe
triggers its independent setup for that given subscriber".
それはすべての加入者が互いに独立して実行している理由です.しかし、RXJSチームは、作成する方法を提供しますmulticasted Obsevables ."
コードの主題
import { Subject } from "rxjs"
const subject = new Subject();
// Subscriber 1
subject.subscribe({
next: (v) => console.log(`observerA: ${v}`)
});
subject.next(1);
// Subscriber 2
subject.subscribe({
next: (v) => console.log(`observerB: ${v}`)
});
subject.next(2);
Working example 件名では、件名がリードを取る見ることができます.これは、待機の代わりに両方の加入者にメッセージを送信します.私の意見では、これは明らかに定期的に観察可能との間の違いを示しています.
The RxJS documentation 次のように言います.
Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers, similarly to how addListener usually works in other libraries and languages.
主題
私たちは
Subject
はObservable
. しかし、1つの加入者に情報を送る代わりに、彼らは同時に複数の加入者に彼らのデータを送ることができます(彼らは、マルチキャスト).エー
Subject
使用できる3つのメソッドがあります.subscribe
このメソッドを使用すると、新しい加入者のサブスクリプションをアクティブにすることができます.next
このメソッドを使用すると、新しい値を渡すことができます.すべての現在の加入者は、これを受けます.complete
このメソッドを使用すると、対象にすべてのサブスクリプションを閉じることができます.next
メソッドはすべての購読者に値を送ります.しかし、加入者が購読される前に値がすでに送られるなら、それはそのデータを受けません.をクリックします.
const rxjs = require('rxjs');
const { Subject } = rxjs
const subject = new Subject();
// Subscriber 1
subject.subscribe({
next: (v) => console.log(`observerA: ${v}`)
});
subject.next(1);
// Subscriber 2
subject.subscribe({
next: (v) => console.log(`observerB: ${v}`)
});
subject.next(2);
Working example 行動学科
The
BehaviourSubject
はSubject
. このバリアントは、現在の値Subject
です.現在の加入者にデータを送信している場合には、非常に有用となる.しかし、別の加入者は、後の瞬間に導入されます.現在の値をその加入者に渡すこともあります.と
BehaviourSubject
あなたはそれを行うことができます.をクリックします.import { BehaviorSubject } from "rxjs"
const subject = new BehaviorSubject(0); // 0 is the initial value
subject.subscribe({
next: (v) => console.log(`observerA: ${v}`)
});
subject.next(1);
subject.next(2);
subject.subscribe({
next: (v) => console.log(`observerB: ${v}`)
});
subject.next(3);
Working example したがって、
BehaviourSubject
加入者に最後の既知の値を与えるObservable
. しかし、あなたが前の値より少しを望むならば、どうですか?演題
The
ReplaySubject
それは言う.それは新しい加入者に値の一定量を再生することができます.DJが遊んでいるオンラインプレイリストを考えてください.しかし、あなたはそのストリームに戻りたいです.The
ReplaySubject
することができます3つのトラックを反転し、そこからリスニングを開始することを確認します.をクリックします.import { ReplaySubject } from "rxjs"
const subject = new ReplaySubject(2); // buffer 3 values for new subscribers
subject.subscribe({
next: (v) => console.log(`observerA: ${v}`)
});
subject.next(1);
subject.next(2);
subject.next(3);
subject.subscribe({
next: (v) => console.log(`observerB: ${v}`)
});
subject.next(4);
subject.next(5);
Working example あなたが見ることができるように
ReplaySubject(2)
, 私はナンバー2を通過しましたSubject
すべての新しい加入者に最後の2つの値を送る必要があること.その新しい加入者が渡された値を受け取ったとき、それは他の加入者と同期しています.
しかし、それを確認するには
ReplaySubject(10000)
すべての新しい加入者に一定の値を渡すことはありません、我々はそれに制限時間を与えることができます.以下の例では、メモリに100の値を保持し、新しい加入者に渡すことができますが、それらの値は500ミリ秒で有効です.const subject = new ReplaySubject(100, 500);
この機能は多くの可能性を与えるので、それでスマートにしてください.非対象
私が見たとき
AsyncSubject
そして、それが完了したとき、それが加入者に最新の価値を送るだけであるのを見て、私は「なぜ私はこれを使いたいですか?」と思いました.見るまでthis post on Medium . それで、これはある考えを与えました
AsyncSubject
AJAXリクエストの大きな候補です.ほとんどの要求を得るため、あなたは1つだけの応答を待つつもりだ、右.import { AsyncSubject } from "rxjs"
const subject = new AsyncSubject();
subject.subscribe({
next: (v) => console.log(`observerA: ${v}`)
});
subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);
subject.subscribe({
next: (v) => console.log(`observerB: ${v}`)
});
subject.next(5);
subject.complete();
Working example 上記の「実行」ボタンをクリックすると、
AsyncSubject
複数の値を渡しますが、complete()
メソッドが呼び出されます.空隙
あなたがAを使うシナリオの大部分で
Subject
加入者と共に、あなたが通過した値へのアクセスを得ることは関連しています.しかし、実際の値を必要としないが、イベントにフックするだけで、値を必要としない場合.それはあなたがvoid subjectを使用するときです.のデフォルトの動作
Subject
それだけです.をクリックします.import { Subject } from "rxjs"
const subject = new Subject(); // Shorthand for Subject<void>
subject.subscribe({
next: () => console.log('One second has passed')
});
setTimeout(() => subject.next(), 1000);
Working example 結論
これを包んで、レギュラーを必要とするときに終わりましょう
Observable
またはSubject
種類…を観察できる
レギュラー
Observable
つの加入者を必要とするときに使用されるべきです.または、最初に来る加入者が第2が値を得るまで、最初に終えられることを気にしないでください.…を使う
あなたが複数の加入者と注意が必要とするとき、すべての加入者は同時に彼らの新しい価値を得ています
Subject
.BehaviourSubject
ときに、最後の指定値が必要です.ReplaySubject
ときに、最後の指定値よりも必要があります.(例えば、前の5つの値)または値のタイムウィンドウを設定したい場合は、定期的に購読者に送ることができます.AsyncSubject
最後の値が購読者に渡されるだけであるとき.Subject
任意の値を渡すだけではなく、イベントにフックしたい場合.ありがとう
私はあなたが何か新しいことを学んだか、この物語を読んだ後、何か新しいものを作成することに触発されて願っています!🤗 もしそうならば、電子メール(このページの最上部へスクロールする)を通して購読するか、HashNodeでここで私について来てください.
*
Did you know that you can create a Developer blog like this one, yourself? It's entirely for free. 👍💰🎉🥳🔥
私が質問または何かを応答として言うためにあなたを残したならば、スクロールして、私にメッセージを入力してください.あなたがそれを秘密にしたいとき、私に送ってください.私のDMは常に開いている😁
Reference
この問題について(使用時RXJSサブジェクト、BehaviorSubject、ReplaySubject、AsyncSubject、または角度の空の件名), 我々は、より多くの情報をここで見つけました https://dev.to/devbyrayray/when-use-rxjs-subject-behavioursubject-replaysubject-asyncsubject-or-void-subject-in-angular-4pn9テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol