Subject와 Behavior Subject의 차이점은 무엇입니까?
잘 요.Subject
a. a. a.BehaviorSubject
★★★★★★★★★★★★★★★★★★★★★★★★.BehaviorSubject
가지고 있다getValue()
능하하??? ???
Behavior Subject에는 1개의 값이 있습니다.서브스크라이브되면 즉시 값이 방출됩니다.제목에 값이 없습니다.
제목 예(RxJS 5 API 사용):
const subject = new Rx.Subject();
subject.next(1);
subject.subscribe(x => console.log(x));
콘솔 출력이 비어 있습니다.
Behavior Subject의 예:
const subject = new Rx.BehaviorSubject(0);
subject.next(1);
subject.subscribe(x => console.log(x));
콘솔 출력: 1
추가 정보:
BehaviorSubject
(신규) new(신규) new(신규) new(신규) new(신규) new(신규) new(신규) new(신규).Rx.BehaviorSubject(1)
ReplaySubject
제목에 이전에 게시된 값을 가져오려면 다음과 같이 하십시오.
동작 서브젝트
BehaviorSubject는 서브스크립션의 초기값 또는 현재값을 반환합니다.
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);
출력:
observerA: 0
observerA: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3
주제
Subject(제목) Subscription(구독)에만 트리거 됩니다..next(value)
하여 "Return/을 반환합니다.value
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);
콘솔에서의 다음 출력:
observerA: 2
observerB: 2
observerA: 3
observerB: 3
저는 방금 모든 과목의 차이를 설명하는 프로젝트를 만들었습니다.
https://github.com/piecioshka/rxjs-subject-vs-behavior-vs-replay-vs-asynchttpsgithub.com/piecioshka/
BehaviorSubject
는 관측 가능한 에 의해 마지막으로 방출된 값을 메모리에 저장합니다. 골손 a aSubject
그렇지 않다.
BehaviorSubject
~와 ReplaySubject
1로 하다
업데이트: 이 두 가지를 구분하는 Edge 사용 사례가 있습니다.https://medium.com/javascript-everyday/behaviorsubject-vs-replaysubject-1-beware-of-edge-cases-b361153d9ccf
TLDR: 서브젝트에 푸시된 것이 없는 경우에도 서브스크립션 시에 초기값을 제공하려면 Behavior Subject를 사용합니다.환자가 이미 닫혀 있는 경우에도 마지막 값을 관찰자에게 재생하려면 ReplaySubject(1)를 사용하십시오.
이해하는데 도움이 될 거야
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
A BehaviorSubject
는 1개의 값을 보유하고 있습니다(따라서 실제로는 기본값을 초기화할 필요가 있습니다).서브스크라이브되면 그 값이 즉시 방출됩니다.aSubject
,,,, 는는보보보보보않다 다다다다다다다
말은 실제로 '어디서나 하다'라는 뜻입니다.Subject
서브스크라이버는 다음 값만 받습니다.BehaviorSubject
서브스크라이버는 이전 값과 향후 값을 받습니다.
다음으로 동작 예를 제시하겠습니다.
let mySubject = new Subject<number>();
mySubject.subscribe(x => console.log("The first Subscription : " + x));
mySubject.next(1);
mySubject.next(2);
mySubject.subscribe(x => console.log("The second Subscription : " + x));
mySubject.next(3);
// The first Subscription : 1
// The first Subscription : 2
// The first Subscription : 3
// The second Subscription : 3
위와 같이 두 번째 서브스크립션이 등록되기 전에 처음 2개의 값이 서브젝트로부터 출력되었기 때문에 취득되지 않고 서브스크립션 후에만 새로운 값이 취득되었습니다.첫 번째 값이 출력되기 전에 구독했기 때문에 첫 번째 구독은 모두 취득했습니다.
자, 그럼 이제 다음 단계로 넘어갑시다.subject
로.BehaviorSubject
그 차이를 확인하세요.
let mySubject = new BehaviorSubject<number>(0);
mySubject.subscribe((x) => console.log('The first Subscription : ' + x));
mySubject.next(1);
mySubject.next(2);
mySubject.subscribe((x) => console.log('The second Subscription : ' + x));
mySubject.next(3);
// The first Subscription : 0 (since it's the initial value)
// The first Subscription : 1
// The first Subscription : 2
// The second Subscription : 2 (since it's the initial value for the seconde subscriber)
// The first Subscription : 3
// The second Subscription : 3
첫 번째 서브스크라이버가 어떻게 출력하는지 주목해 주세요.0
그 이후BehaviorSubject
로 초기화되었습니다.0
두 번째 서브스크라이버가 서브스크라이버에 가입하면 그 서브스크라이버는 마지막으로 처리한 값이기 때문에 즉시 "2" 값을 방출하여 그 초기값으로 기능합니다.
다른 점의 상세하게BehaviorSubject
그리고.Subject
여기서 찾을 수 있다
BehaviorSubject는 서브스크립션 후에 Subject 번호의 값을 내보냅니다.
// Subject
const mySubject = new Rx.Subject().subscribe((v) => console.log(v)); // will return nothing
// BehaviorSubject
const myBehaviorSubject = new Rx.BehaviorSubject(666).subscribe((v) => console.log(v)); // will return 666 when subscription occurs
BehaviorSubject keeps in memory the last value that was emitted by the observable. A regular Subject doesn't. So we can update dynamic titles based on Behaviour Subject.
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);
- With Output
이 세 가지는 모두 상당히 다릅니다.여기서 몇 가지 샘플을 더 드리겠습니다.
const subject = new Rx.Subject();
const behaviorSubject = new Rx.BehaviorSubject([]);
const relaySubject = new Rx.ReplaySubject();
subject.next(1)
behaviorSubject.next(1);
behaviorSubject.next(2);
behaviorSubject.next(3);
relaySubject.next(1);
relaySubject.next(2);
relaySubject.next(3);
subject.subscribe(val => console.log('From Subject', val)); // this will not emits
behaviorSubject.subscribe(val => console.log('From BehaviorSubject', val)); // this will emits only last value
relaySubject.subscribe(val => console.log('From ReplaySubject', val)); // this will emit all values
보다시피, 우리가 (다음(...)을 발표한 후에 그 주제를 구독할 때,
- subject - 이것은 전혀 실행되지 않습니다.
- behavior Subject - 마지막 값으로 한 번 실행됩니다.
- ReplaySubject - 3회 호출됩니다.
next()
우리는 가지고 있다.
그 차이는 주로 어디서 구독하느냐에 따라 달라집니다.next()
또는 그 후next()
.
실제적인 경우, 우리는 오직 다음 시간에만 이벤트를 발사한다.next()
[즉, 피험자에게 데이터를 채운 후]
4가지 환자 유형을 모두 테스트하는 프로그램:Subject, Behavior Subject, Replay Subject 및 Async Subject
// 1. Subject - only value after subscribed
var subject = new Subject();
subject.next(1);
subject.next(2);
subject.complete();
subject.subscribe(
(data) => this.log("Subject="+data),
(error) => this.log(error),
() => this.log('Complete Subject')
);
subject.next(3);
subject.next(4);
// 2. BehaviorSubject - only last value before subscribed and all after subscription
// calls on initalization, mandatory to specify a value
var subjectb = new BehaviorSubject<any>(5);
subjectb.next(1);
subjectb.next(2);
subjectb.complete();
subjectb.subscribe(
(data) => this.log("Behavior="+data),
(error) => this.log(error),
() => this.log('Complete Behavior')
);
// 3. ReplaySubject - all specified last values before subscribed and all after subscription
// Does not call on initalization, no default value
var subjectr = new ReplaySubject(5);
subjectr.next(1);
subjectr.next(2);
subjectr.complete();
subjectr.subscribe(
(data) => this.log("Replay="+data),
(error) => this.log(error),
() => this.log('Complete Replay')
);
// 4. AsyncSubject - only last values before calling complete
var subjecta = new AsyncSubject();
subjecta.next(1);
subjecta.next(2);
subjecta.complete();
subjecta.subscribe(
(data) => this.log("Async="+data),
(error) => this.log(error),
() => this.log('Complete Async')
);
https://stackblitz.com/edit/example-rxjs-subject-e8vj9y?embed=1&file=app/app.component.ts
언급URL : https://stackoverflow.com/questions/43348463/what-is-the-difference-between-subject-and-behaviorsubject
'programing' 카테고리의 다른 글
JSON 표준 - 부동 소수점 수 (0) | 2023.03.26 |
---|---|
woocommerce 가게는 어디서 주문하나요? (0) | 2023.03.26 |
각도 2 요소 표시 및 숨기기 (0) | 2023.03.26 |
클래스를 통해 추가된 작업을 제거하는 방법 (0) | 2023.03.26 |
스프링 부트가 정적 콘텐츠를 제공하지 않음 (0) | 2023.03.26 |