programing

Subject와 Behavior Subject의 차이점은 무엇입니까?

css3 2023. 3. 26. 11:38

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~와 ReplaySubject1로 하다

업데이트: 이 두 가지를 구분하는 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

스크린샷을 출력합니다.

보다시피, 우리가 (다음(...)을 발표한 후에 그 주제를 구독할 때,

  1. subject - 이것은 전혀 실행되지 않습니다.
  2. behavior Subject - 마지막 값으로 한 번 실행됩니다.
  3. 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