Câu trả lời:
Một BehaviorSubject giữ một giá trị. Khi được đăng ký, nó phát ra giá trị ngay lập tức. Một chủ đề không giữ một giá trị.
Ví dụ chủ đề (với API RxJS 5):
const subject = new Rx.Subject();
subject.next(1);
subject.subscribe(x => console.log(x));
Đầu ra giao diện điều khiển sẽ trống
Ví dụ về hành vi:
const subject = new Rx.BehaviorSubject();
subject.next(1);
subject.subscribe(x => console.log(x));
Bảng điều khiển đầu ra: 1
Ngoài ra:
BehaviorSubject
có thể được tạo với giá trị ban đầu: mới Rx.BehaviorSubject(1)
ReplaySubject
nếu bạn muốn chủ thể giữ nhiều hơn một giá trịBehaviourSubject sẽ trả về giá trị ban đầu hoặc giá trị hiện tại trên Đăng ký
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);
Với đầu ra:
observerA: 0
observerA: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3
Chủ đề không trả về giá trị hiện tại trên Đăng ký. Nó chỉ kích hoạt .next(value)
cuộc gọi và trả lại / đầu ravalue
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);
Với đầu ra sau trên bàn điều khiển:
observerA: 2
observerB: 2
observerA: 3
observerB: 3
subject.next(3);
Tôi vừa tạo một dự án giải thích sự khác biệt giữa tất cả các đối tượng :
https://github.com/piecioshka/rxjs-subject-vs-behavior-vs-replay-vs-async
Nó có thể giúp bạn hiểu.
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
BehaviorSubject
giữ trong bộ nhớ giá trị cuối cùng được phát ra từ quan sát được. Một thường xuyên Subject
không.
BehaviorSubject
giống như ReplaySubject
với kích thước bộ đệm là 1.