[Angular] BehaviorSubject와 Observable?



Answers

Observable : 각 옵서버마다 다른 결과

하나의 매우 중요한 차이. Observable은 단지 하나의 함수이기 때문에 어떤 상태도 가지지 않으므로 모든 새로운 Observer에 대해 관찰 가능한 create 코드를 반복해서 실행합니다. 결과는 다음과 같습니다.

코드는 각 관찰자에 대해 실행됩니다. HTTP 호출 인 경우 각 관찰자에 대해 호출됩니다.

이로 인해 주요 버그와 비효율이 발생합니다.

BehaviorSubject (또는 Subject)는 관찰자 세부 정보를 저장하고 코드를 한 번만 실행하고 모든 관찰자에게 결과를 제공합니다.

전의:

JSBin : http://jsbin.com/qowulet/edit?js,console

// --- Observable ---
let randomNumGenerator1 = Rx.Observable.create(observer => {
   observer.next(Math.random());
});

let observer1 = randomNumGenerator1
      .subscribe(num => console.log('observer 1: '+ num));

let observer2 = randomNumGenerator1
      .subscribe(num => console.log('observer 2: '+ num));


// ------ BehaviorSubject/ Subject

let randomNumGenerator2 = new Rx.BehaviorSubject(0);
randomNumGenerator2.next(Math.random());

let observer1Subject = randomNumGenerator2
      .subscribe(num=> console.log('observer subject 1: '+ num));
      
let observer2Subject = randomNumGenerator2
      .subscribe(num=> console.log('observer subject 2: '+ num));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.3/Rx.min.js"></script>

출력 :

"observer 1: 0.7184075243594013"
"observer 2: 0.41271850211336103"
"observer subject 1: 0.8034263165479893"
"observer subject 2: 0.8034263165479893"

Observable.create 사용하여 각 관찰자마다 다른 출력을 생성하는 방법을 Observable.create 하지만 BehaviorSubject 는 모든 관찰자에 대해 동일한 출력을 제공했습니다. 이건 중요하다.

다른 차이점이 요약되었습니다.

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃         Observable                  ┃     BehaviorSubject/Subject         ┃      
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ 
│ Is just a function, no state        │ Has state. Stores data in memory    │
├─────────────────────────────────────┼─────────────────────────────────────┤
│ Code run for each observer          │ Same code run                       │
│                                     │ only once for all observers         │
├─────────────────────────────────────┼─────────────────────────────────────┤
│ Creates only Observable             │Can create and also listen Observable│
│ ( data producer alone )             │ ( data producer and consumer )      │
├─────────────────────────────────────┼─────────────────────────────────────┤
│ Usage: Simple Observable with only  │ Usage:                              │
│ one Obeserver.                      │ * Store data and modify frequently  │
│                                     │ * Multiple observers listen to data │
│                                     │ * Proxy between Observable  and     │
│                                     │   Observer                          │
└─────────────────────────────────────┴─────────────────────────────────────┘
Question

Angular RxJs 패턴을 조사하고 있는데 BehaviorSubjectObservable 의 차이를 이해하지 못합니다.

내 이해에서 BehaviorSubject 는 시간이 지남에 따라 바뀔 수있는 값입니다 (구독 할 수 있고 구독자는 업데이트 된 결과를받을 수 있음). 이것은 Observable 과 정확히 같은 목적으로 보인다.

ObservableBehaviorSubject 언제 사용합니까? Observable BehaviorSubject 를 사용하면 이점이 있습니까?




예제에서 볼 수없는 한 가지는 BehaviorSubject를 asObservable을 통해 Observable에 캐스트하면 구독시 마지막 값을 반환하는 동작을 상속받습니다.

라이브러리는 종종 필드를 관찰 가능한 것으로 표시하므로 (예 : Angular2의 ActivatedRoute의 매개 변수), 장면 뒤에 Subject 또는 BehaviorSubject를 사용할 수 있습니다. 그들이 사용하는 것은 구독 행동에 영향을 미칩니다.

여기를 참고하십시오 http://jsbin.com/ziquxapubo/edit?html,js,console

let A = new Rx.Subject();
let B = new Rx.BehaviorSubject(0);

A.next(1);
B.next(1);

A.asObservable().subscribe(n => console.log('A', n));
B.asObservable().subscribe(n => console.log('B', n));

A.next(2);
B.next(2);



Links