BehaviorSubject adalah jenis subjek, subjek adalah jenis khusus yang dapat diamati sehingga Anda dapat berlangganan pesan seperti yang dapat diamati lainnya. Fitur unik BehaviorSubject adalah:
- Dibutuhkan nilai awal karena harus selalu mengembalikan nilai pada berlangganan bahkan jika belum menerima
next()
- Setelah berlangganan, ia mengembalikan nilai terakhir dari subjek. Yang diamati secara teratur hanya memicu ketika menerima
onnext
- kapan saja, Anda dapat mengambil nilai terakhir dari subjek dalam kode yang tidak dapat diamati menggunakan
getValue()
metode ini.
Fitur unik dari subjek dibandingkan dengan yang dapat diamati adalah:
- Ini adalah pengamat selain menjadi yang dapat diamati sehingga Anda juga dapat mengirim nilai ke subjek selain berlangganan.
Selain itu, Anda bisa melihat subjek perilaku yang dapat diamati menggunakan asObservable()
metode ini BehaviorSubject
.
Dapat diobservasi adalah Generik, dan BehaviorSubject
secara teknis merupakan sub-tipe yang Dapat Diobservasi karena BehaviorSubject dapat diamati dengan kualitas spesifik.
Contoh dengan BehaviorSubject :
// Behavior Subject
// a is an initial value. if there is a subscription
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a");
bSubject.next("b");
bSubject.subscribe(value => {
console.log("Subscription got", value); // Subscription got b,
// ^ This would not happen
// for a generic observable
// or generic subject by default
});
bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d
Contoh 2 dengan subjek reguler:
// Regular Subject
let subject = new Subject();
subject.next("b");
subject.subscribe(value => {
console.log("Subscription got", value); // Subscription wont get
// anything at this point
});
subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d
Terobservasi dapat dibuat dari keduanya Subject
dan BehaviorSubject
menggunakan subject.asObservable()
.
Satu-satunya perbedaan adalah Anda tidak dapat mengirim nilai ke next()
metode menggunakan diamati .
Dalam layanan Angular, saya akan menggunakan BehaviorSubject
layanan data sebagai layanan sudut yang sering diinisialisasi sebelum komponen dan subjek perilaku memastikan bahwa komponen yang mengonsumsi layanan menerima data terakhir yang diperbarui bahkan jika tidak ada pembaruan baru sejak komponen berlangganan data ini.
Diamati: Hasil berbeda untuk setiap Pengamat
Satu perbedaan yang sangat penting. Karena Observable hanyalah sebuah fungsi, ia tidak memiliki status apa pun, jadi untuk setiap Pengamat baru, ia menjalankan kode buat yang dapat diamati berulang kali. Ini menghasilkan:
Ini menyebabkan bug utama dan inefisiensi
BehaviorSubject (atau Subject) menyimpan detail pengamat, menjalankan kode hanya sekali dan memberikan hasilnya kepada semua pengamat.
Ex:
JSBin: http://jsbin.com/qowulet/edit?js,console
Keluaran:
Amati bagaimana menggunakan
Observable.create
output yang dibuat berbeda untuk setiap pengamat, tetapiBehaviorSubject
memberikan hasil yang sama untuk semua pengamat. Ini penting.Perbedaan lainnya dirangkum.
sumber
KnockoutJS's ko.observable()
akan segera melihat lebih banyak persamaanRx.BehaviorSubject
dibandingkan denganRx.Observable
Dapat diamati dan subjek keduanya adalah cara yang dapat diamati yang dapat diamati oleh pengamat. tetapi keduanya memiliki beberapa karakteristik unik. Selanjutnya ada total 3 jenis mata pelajaran yang masing-masing lagi memiliki karakteristik unik. mari kita coba untuk memahami masing-masing dari mereka.
Anda dapat menemukan contoh praktisnya di sini di stackblitz . (Anda perlu memeriksa konsol untuk melihat output aktual)
Observables
Mereka dingin: Kode dijalankan ketika mereka memiliki setidaknya satu pengamat.
Membuat salinan data: Dapat diamati membuat salinan data untuk setiap pengamat.
Uni-directional: Pengamat tidak dapat menetapkan nilai untuk diamati (asal / master).
Subject
Mereka panas: kode dieksekusi dan nilai disiarkan meskipun tidak ada pengamat.
Membagikan data: Data yang sama dibagikan di antara semua pengamat.
bi-directional: Pengamat dapat memberikan nilai untuk diamati (asal / master).
Jika menggunakan subjek maka Anda melewatkan semua nilai yang disiarkan sebelum pembuatan pengamat. Jadi inilah Subyek Putar Ulang
ReplaySubject
Mereka panas: kode dieksekusi dan nilai disiarkan meskipun tidak ada pengamat.
Membagikan data: Data yang sama dibagikan di antara semua pengamat.
bi-directional: Pengamat dapat memberikan nilai untuk diamati (asal / master). plus
Putar ulang aliran pesan: Tidak masalah ketika Anda berlangganan subjek replay, Anda akan menerima semua pesan yang disiarkan.
Dalam subjek dan subjek replay Anda tidak dapat mengatur nilai awal untuk diamati. Jadi inilah Subyek Perilaku
BehaviorSubject
Mereka panas: kode dieksekusi dan nilai disiarkan meskipun tidak ada pengamat.
Membagikan data: Data yang sama dibagikan di antara semua pengamat.
bi-directional: Pengamat dapat memberikan nilai untuk diamati (asal / master). plus
Putar ulang aliran pesan: Tidak masalah ketika Anda berlangganan subjek replay, Anda akan menerima semua pesan yang disiarkan.
Anda dapat menetapkan nilai awal: Anda dapat menginisialisasi nilai yang dapat diamati dengan nilai default.
sumber
ReplaySubject
memiliki sejarah dan dapat menyiarkan / memancarkan urutan nilai (lama). Hanya ketika buffer diatur ke 1 ia berperilaku mirip dengan aBehaviorSubject
.Objek yang dapat diobservasi mewakili koleksi berbasis push.
Antarmuka Observer dan Observable menyediakan mekanisme umum untuk pemberitahuan berbasis push, juga dikenal sebagai pola desain pengamat. Objek yang Dapat Diobservasi mewakili objek yang mengirim pemberitahuan (penyedia); objek Observer mewakili kelas yang menerimanya (pengamat).
Kelas Subjek mewarisi Observable dan Observer, dalam arti bahwa itu adalah observer dan observable. Anda bisa menggunakan subjek untuk berlangganan semua pengamat, dan kemudian berlangganan subjek ke sumber data backend
Lebih lanjut tentang https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md
sumber
Satu hal yang tidak saya lihat dalam contoh adalah ketika Anda menggunakan BehaviorSubject to Observable via asObservable, ia mewarisi perilaku mengembalikan nilai terakhir pada langganan.
Ini agak sulit, karena sering perpustakaan akan mengekspos bidang sebagai diamati (yaitu params di ActivatedRoute di Angular2), tetapi dapat menggunakan Subjek atau Perilaku Subjek di belakang layar. Apa yang mereka gunakan akan memengaruhi perilaku berlangganan.
Lihat di sini http://jsbin.com/ziquxapubo/edit?html,js,console
sumber
Sebuah diamati memungkinkan Anda untuk berlangganan hanya sedangkan subjek memungkinkan Anda untuk kedua mempublikasikan dan berlangganan.
Jadi subjek memungkinkan layanan Anda digunakan sebagai penerbit dan pelanggan.
Sampai sekarang, saya tidak begitu pandai
Observable
sehingga saya hanya akan membagikan contohSubject
.Mari kita mengerti lebih baik dengan contoh CLI Angular Jalankan perintah di bawah ini:
Ganti konten
app.component.html
dengan:Jalankan perintah
ng g c components/home
untuk menghasilkan komponen rumah. Ganti kontenhome.component.html
dengan:#message
adalah variabel lokal di sini. Tambahkan propertimessage: string;
ke kelasapp.component.ts
's.Jalankan perintah ini
ng g s service/message
. Ini akan menghasilkan layanan disrc\app\service\message.service.ts
. Berikan layanan ini ke aplikasi .Impor
Subject
keMessageService
. Tambahkan subjek juga. Kode akhir akan terlihat seperti ini:Sekarang, suntikkan layanan ini
home.component.ts
dan berikan instance ke konstruktor. Lakukan iniapp.component.ts
juga. Gunakan contoh layanan ini untuk meneruskan nilai#message
ke fungsi layanansetMessage
:Di dalam
app.component.ts
, berlangganan dan berhenti berlangganan (untuk mencegah kebocoran memori) keSubject
:Itu dia.
Sekarang, setiap nilai masuk dalam
#message
darihome.component.html
akan dicetak ke{{message}}
dalamapp.component.html
sumber
app.component.ts
behaviour.service.ts
custom.component.ts
sumber
BehaviorSubject vs Observable : RxJS memiliki pengamat dan dapat diobservasi, Rxjs menawarkan beberapa kelas untuk digunakan dengan aliran data, dan salah satunya adalah BehaviorSubject.
Observable : Observable adalah koleksi malas dari berbagai nilai dari waktu ke waktu.
BehaviorSubject : Subjek yang membutuhkan nilai awal dan memancarkan nilainya saat ini untuk pelanggan baru.
sumber
Pikirkan Observable sebagai pipa dengan air yang mengalir di dalamnya, kadang-kadang air mengalir dan terkadang tidak. Dalam beberapa kasus, Anda mungkin benar-benar membutuhkan pipa yang selalu berisi air, Anda dapat melakukannya dengan membuat pipa khusus yang selalu mengandung air, sekecil apa pun itu, sebut saja pipa khusus ini , BehaviorSubject , jika Anda kebetulan penyedia pasokan air di komunitas Anda, Anda dapat tidur nyenyak di malam hari mengetahui bahwa pipa yang baru Anda pasang berfungsi.
Dalam istilah teknis: Anda dapat menemukan kasus penggunaan di mana Observable harus selalu memiliki nilai di dalamnya, mungkin Anda ingin menangkap nilai teks input dari waktu ke waktu, Anda kemudian dapat membuat instance BehaviorSubject untuk memastikan perilaku semacam ini, katakanlah:
Anda kemudian dapat menggunakan "nilai" untuk sampel perubahan dari waktu ke waktu.
Ini berguna ketika Anda menggabungkan Observables nanti, dengan melihat jenis aliran Anda sebagai BehaviorSubject Anda kemudian dapat memastikan bahwa aliran setidaknya menyala atau sinyal sekali saja minimal .
sumber