Apa perbedaan antara Subjek dan Subjek Perilaku?


250

Saya tidak jelas tentang perbedaan antara a Subjectdan a BehaviorSubject. Apakah hanya itu yang BehaviorSubjectmemiliki getValue()fungsi?

Jawaban:


311

BehaviorSubject memegang satu nilai. Saat berlangganan, ia akan segera mengeluarkan nilai. Subjek tidak memiliki nilai.

Contoh subjek (dengan RxJS 5 API):

const subject = new Rx.Subject();
subject.next(1);
subject.subscribe(x => console.log(x));

Output konsol akan kosong

Contoh BehaviorSubject:

const subject = new Rx.BehaviorSubject();
subject.next(1);
subject.subscribe(x => console.log(x));

Output konsol: 1

Sebagai tambahan:

  • BehaviorSubject dapat dibuat dengan nilai awal: baru Rx.BehaviorSubject(1)
  • Pertimbangkan ReplaySubjectjika Anda ingin subjek memiliki lebih dari satu nilai

16
Jadi, maksud Anda, Anda harus berlangganan ke subjek sebelum subject.next () agar ini berfungsi?
Eric Huang

5
@ eric untuk Subjek, ya. Itulah perbedaannya.
onefootswill

9
Perhatikan bahwa Anda harus memasukkan nilai pertama ke konstruktor BehaviorSubject;)
mrmashal

jika kita membuat subjek dengan boolean bahkan subjek memancarkan ritus ?? const subject = Subjek baru <boolean> (); subject.next (true);
user2900572

Jika ini membantu: Subjects = Event - BehaviorSubject = State;
Jonathan Stellwag

251

BehaviourSubject

BehaviourSubject akan mengembalikan nilai awal atau nilai saat ini pada Langganan

var bSubject= new Rx.BehaviorSubject(0);  // 0 is the initial value

bSubject.subscribe({
  next: (v) => console.log('observerA: ' + v)  // output initial value, then new values on `next` triggers
});

bSubject.next(1);  // output new value 1 for 'observer A'
bSubject.next(2);  // output new value 2 for 'observer A', current value 2 for 'Observer B' on subscription

bSubject.subscribe({
  next: (v) => console.log('observerB: ' + v)  // output current value 2, then new values on `next` triggers
});

bSubject.next(3);

Dengan output:

observerA: 0
observerA: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3

Subyek

Subjek tidak mengembalikan nilai saat ini pada Langganan. Ini hanya memicu .next(value)panggilan dan mengembalikan / outputvalue

var subject = new Rx.Subject();

subject.next(1); //Subjects will not output this value

subject.subscribe({
  next: (v) => console.log('observerA: ' + v)
});
subject.subscribe({
  next: (v) => console.log('observerB: ' + v)
});

subject.next(2);
subject.next(3);

Dengan output berikut di konsol:

observerA: 2
observerB: 2
observerA: 3
observerB: 3

12
Ini juga lebih benar: "BehaviourSubject akan mengembalikan nilai awal atau nilai saat ini pada Langganan" adalah penjelasan yang lebih baik daripada "A BehaviorSubject memegang satu nilai."
Davy

1
Aku meletakkan kode di atas pada Stackblitz: stackblitz.com/edit/rxjs-subjectvsbehaviorsubject
Fredrik_Macrobond

Di mana pengamat B: 3?
OPV

@OPV ObserverB: 3 ada di sana saat Anda meneleponsubject.next(3);
Mohammed Safeer


6

Mungkin membantu Anda untuk mengerti.

import * as Rx from 'rxjs';

const subject1 = new Rx.Subject();
subject1.next(1);
subject1.subscribe(x => console.log(x)); // will print nothing -> because we subscribed after the emission and it does not hold the value.

const subject2 = new Rx.Subject();
subject2.subscribe(x => console.log(x)); // print 1 -> because the emission happend after the subscription.
subject2.next(1);

const behavSubject1 = new Rx.BehaviorSubject(1);
behavSubject1.next(2);
behavSubject1.subscribe(x => console.log(x)); // print 2 -> because it holds the value.

const behavSubject2 = new Rx.BehaviorSubject(1);
behavSubject2.subscribe(x => console.log('val:', x)); // print 1 -> default value
behavSubject2.next(2) // just because of next emission will print 2 

4

BehaviorSubjectmenyimpan dalam memori nilai terakhir yang dipancarkan oleh yang diamati. Biasa Subjecttidak.

BehaviorSubjectseperti ReplaySubjectdengan ukuran buffer 1.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.