Sự khác biệt giữa Chủ đề và Hành vi là gì?


250

Tôi không rõ ràng về sự khác biệt giữa a Subjectvà a BehaviorSubject. Là nó chỉ là một BehaviorSubjectgetValue()chức năng?

Câu trả lời:


311

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)
  • Xem xét ReplaySubjectnếu bạn muốn chủ thể giữ nhiều hơn một giá trị

16
Vì vậy, bạn có nghĩa là bạn phải đăng ký chủ đề trước chủ đề.next () để làm việc này?
Eric Huang

5
@eric cho môn học, vâng. Đó là sự phân biệt.
onefootswill

9
Lưu ý rằng bạn phải chuyển giá trị đầu tiên cho hàm tạo của BehaviorSubject;)
mrmashal

nếu chúng ta tạo chủ đề với boolean thậm chí chủ đề phát ra nghi thức ?? const môn = chủ đề mới <boolean> (); chủ đề.next (đúng);
dùng2900572

Nếu nó giúp: Chủ đề = Sự kiện - BehaviorSubject = State;
Jonathan Stellwag

251

BehaviourSubject

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

Môn học

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

12
Nó cũng đúng hơn: "BehaviourSubject sẽ trả về giá trị ban đầu hoặc giá trị hiện tại trên Đăng ký" là một lời giải thích tốt hơn so với "Một BehaviorSubject giữ một giá trị."
Davy

1
Tôi đặt mã ở trên trên Stackblitz: stackblitz.com/edit/rxjs-subjectvsbehaviorsubject
Fredrik_Macrobond

Người quan sátB: 3 ở đâu?
OPV

@OPV ObserverB: 3 ở đó trong khi bạn gọisubject.next(3);
Mohammed Safeer


6

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 

4

BehaviorSubjectgiữ trong bộ nhớ giá trị cuối cùng được phát ra từ quan sát được. Một thường xuyên Subjectkhông.

BehaviorSubjectgiống như ReplaySubjectvới kích thước bộ đệm là 1.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.