Programing

주제 대 행동 주제 대 ReplaySubject in Angular

lottogame 2020. 9. 23. 08:04
반응형

주제 대 행동 주제 대 ReplaySubject in Angular


나는 그 3 :

주제 , 행동 주제재생 주제 . 나는 그것들을 사용하고 싶고 언제 그리고 왜 그것들을 사용하는 것의 이점이 무엇인지 알고 싶습니다. 그리고 문서를 읽었고, 튜토리얼을보고, 구글을 검색했지만 나는 이것을 이해하지 못했습니다.

그래서 그들의 목적은 무엇입니까? 실제 사례는 코딩조차 할 필요가없는 것이 가장 좋을 것입니다.

나는 "a + b => c 당신이 구독하고있는 ...."뿐만 아니라 명확한 설명을 선호합니다.

감사합니다


그것은 실제로 행동과 의미론으로 귀결됩니다. 와 함께

  • Subject-구독자는 구독 후 내 보낸 게시 된 값만받습니다 . 스스로에게 물어보십시오. 구독자가 이전 값에 대해 알아야 할 사항이 있습니까? 그렇지 않으면 이것을 사용할 수 있고 그렇지 않으면 다른 하나를 선택할 수 있습니다. 예를 들어 구성 요소 간 통신이 있습니다. 버튼 클릭시 다른 구성 요소에 대한 이벤트를 게시하는 구성 요소가 있다고 가정합니다. 주체가있는 서비스를 이용하여 소통 할 수 있습니다.

  • BehaviorSubject-마지막 값이 캐시됩니다. 구독자는 최초 구독시 최신 가치를 받게됩니다. 이 주제의 의미는 시간이 지남에 따라 변경되는 값을 나타내는 것입니다. 예를 들어 로그인 한 사용자입니다. 초기 사용자는 익명 사용자 일 수 있습니다. 그러나 사용자가 로그인하면 새 값은 인증 된 사용자 상태입니다.

    BehaviorSubject초기 값으로 초기화된다. 이것은 때때로 코딩 선호도에 중요합니다. 예를 들어 null. 그런 다음 구독에서 null 확인을 수행해야합니다. 괜찮을 수도 있고 짜증날 수도 있습니다.

  • ReplaySubject-지정된 배출량까지 캐시 할 수 있습니다. 모든 구독자는 구독시 모든 캐시 된 값을받습니다. 이 동작이 언제 필요합니까? 솔직히 다음과 같은 경우를 제외하고는 그러한 행동이 필요하지 않았습니다.

    당신이를 초기화하는 경우 ReplaySubject의 버퍼 크기 1, 그것은 실제로 작동 단지처럼 BehaviorSubject. 마지막 값은 항상 캐시되므로 시간이 지남에 따라 변경되는 값처럼 작동합니다. null경우 첫 번째 게시 때까지 구독자에게 값이 생성되지 않기 때문에으로 BehaviorSubject초기화 된 경우와 같이 검사 할 필요가 없습니다 null.

따라서 어느 것을 사용할 것인지에 대해 기대하는 동작이 실제로 내려갑니다. 대부분의 경우 a를 사용하고 싶을 것입니다. BehaviorSubject실제로 표현하려는 것은 "시간 경과에 따른 값"의미 체계이기 때문입니다. 그러나 나는 개인적으로 ReplaySubjectinitialized with 1.

피하고 싶은 Subject것은 정말로 필요한 것이 캐싱 동작 일 때 바닐라를 사용하는 것입니다. 예를 들어 라우팅 가드 또는 해결을 작성하고 있습니다. 해당 가드에서 일부 데이터를 가져 와서 서비스에 설정합니다 Subject. 그런 다음 라우팅 된 구성 요소에서 가드에서 내 보낸 값을 가져 오기 위해 서비스 주체에 가입합니다. OOP. 가치는 어디에 있습니까? 이미 방출되었습니다, DUH. "캐싱"주제를 사용하십시오!

또한보십시오:


다양한 관찰 가능한 유형, 직관적이지 않은 이름 지정에 대한 편리한 요약입니다 .

  • Subject -구독자는 구독이 이루어진 후에 만 ​​게시 된 값을 받게됩니다.
  • BehaviorSubject -신규 구독자는 구독 즉시 마지막으로 게시 된 값 또는 초기 값을받습니다.
  • ReplaySubject-신규 구독자 1-n는 구독 즉시 마지막으로 게시 된 값을받습니다 (이전에 발행 된 경우에만).

출처 : Randall Koutnik 책“RxJS로 반응 형 웹 사이트 구축” :

주제는 A가 관찰 터보 차저의 개체입니다. 핵심에서 주제 는 일반 관찰 가능 항목과 매우 유사하지만 각 구독은 동일한 소스에 연결됩니다. 주제 는 또한 관찰자이며 모든 구독자에게 한 번에 데이터를 전송하는 next, error 및 done 메소드가 있습니다. 주체 는 옵저버 이기 때문에 구독 호출로 직접 전달 될 수 있으며 원본 옵저버 블의 모든 이벤트는 주체를 통해 구독자에게 전송됩니다.

ReplaySubject사용하여 기록 을 추적 할 수 있습니다 . ReplaySubject는 그들에게 모든 새로운 가입자에게 다시 마지막 n 이벤트 및 palys를 기록합니다. 예를 들어 채팅 응용 프로그램에서. 이전 채팅 기록을 추적하는 데 사용할 수 있습니다.

BehaviorSubject는 의 단순화 된 버전입니다 ReplaySubject . ReplaySubject 이벤트의 임의의 수를 저장은 BehaviorSubject은 최신 이벤트의 값을 기록합니다. BehaviorSubject 가 새 구독을 기록 할 때마다 구독자에게 최신 값과 전달 된 새 값을 내 보냅니다 . BehaviorSubject 는 구성 옵션과 같은 단일 상태 단위를 처리 할 때 유용합니다.


  1. 제목 : 구독시 항상 구독 후 푸시 된 데이터를 가져옵니다. 즉, 이전 푸시 된 값이 수신되지 않습니다 .
const mySubject = new Rx.Subject();

mySubject.next(1);

const subscription1 = mySubject.subscribe(x => {
  console.log('From subscription 1:', x);
});

mySubject.next(2);

const subscription2 = mySubject.subscribe(x => {
  console.log('From subscription 2:', x);
});

mySubject.next(3);

subscription1.unsubscribe();

mySubject.next(4);

이 예에서 콘솔에 인쇄 될 결과는 다음과 같습니다.

From subscription 1: 2
From subscription 1: 3
From subscription 2: 3
From subscription 2: 4

Note how subscriptions that arrive late are missing out on some of the data that’s been pushed into the subject.

  1. Replay subjects: can help by keeping a buffer of previous values that will be emitted to new subscriptions.

Here’s a usage example for replay subjects where a buffer of 2 previous values are kept and emitted on new subscriptions:

const mySubject = new Rx.ReplaySubject(2);

mySubject.next(1);
mySubject.next(2);
mySubject.next(3);
mySubject.next(4);

mySubject.subscribe(x => {
  console.log('From 1st sub:', x);
});

mySubject.next(5);

mySubject.subscribe(x => {
  console.log('From 2nd sub:', x);
});

Here’s what that gives us at the console:

From 1st sub: 3
From 1st sub: 4
From 1st sub: 5
From 2nd sub: 4
From 2nd sub: 5
  1. Behavior subjects: are similar to replay subjects, but will re-emit only the last emitted value, or a default value if no value has been previously emitted:
const mySubject = new Rx.BehaviorSubject('Hey now!');

mySubject.subscribe(x => {
  console.log('From 1st sub:', x);
});

mySubject.next(5);

mySubject.subscribe(x => {
  console.log('From 2nd sub:', x);
});

And the result:

From 1st sub: Hey now!
From 1st sub: 5
From 2nd sub: 5

Reference: https://alligator.io/rxjs/subjects/


     // ***********Subject  concept ***********
    let subject = new Subject<string>();


    subject.next("Eureka");
    subject.subscribe((data) => {
      console.log("Subscriber 1 got data >>>>> "+ data);
    });
    subject.subscribe((data) => {
      console.log("Subscriber 2 got data >>>>> "+ data);
    });

       // ********behaviour subject*********
    // Behavior subjects need a first value
let subject1 = new BehaviorSubject<string>("First value");


subject1.asObservable().subscribe((data) => {
  console.log("First subscriber got data behaviour subject>>>>> "+ data);
});
subject1.next("Second value")
  • Subject - A subscriber will only get published values thereon-after the subscription is made.
  • BehaviorSubject - New subscribers get the last published value OR initial value immediately upon subscription.

참고URL : https://stackoverflow.com/questions/43118769/subject-vs-behaviorsubject-vs-replaysubject-in-angular

반응형