2017-09-13 9 views
1

나는 관찰하기가 매우 새롭다. 메모리 누수가 걱정된다.RxJS : BehaviorSubject unsubscribe

private client = new BehaviorSubject(""); 
clientStream$ = this.client.asObservable(); 

그들에게 susbscirbe과 같이보기에 :

this.clientService.clientStream$.subscribe(
    client => { 
    this.client = client; 
    } 
} 

내가 구독을 취소해야합니까 나는 다음과 같은 작성하는 경우?client.getValue()을 호출하면 어떻게됩니까?

답변

2

탈퇴해야합니까?

아마도.

완료 할 주제를 디자인하는 경우 - 즉, client.complete() (또는 rxjs 4를 사용하는 경우 client.onCompleted())으로 전화를 걸려면 구독을 자동으로 끊어 버리십시오.

그러나 종종 귀하의 행동 주제는 지속되는 일부 서비스에있을 것이며 귀하는 그것을 완료하고 싶지 않습니다. 이 경우 탈퇴해야합니다.

1) 수동 :

당신이 .subscribe 전화

, 당신은 다시 가입 개체를 얻을 당신이 취소 할 수있는 두 가지 방법이 있습니다. .unsubscribe() (rxjs 4의 .dispose()) 전화를하면 수신 거부됩니다. 예 :

const subscription = this.clientService.clientStream$ 
    .subscribe(client => this.client = client); 

setTimeout(() => subscription.unsubscribe(), 10000); // unsubscribe after 10 seconds 

2) 자동으로 다른 관찰 가능 항목을 기반으로합니다. 응용 프로그램에서 관찰 대상을 자주 사용하는 경우이 방법이 매우 편리 할 것입니다.

관찰 대상에는 .takeUntil 연산자가 있습니다.이 관찰자는 다른 관찰 대상에서 전달할 수 있습니다. 그 두 번째 관측 값이 값을 내면, 그것은 당신을 위해 탈퇴를 할 것입니다. 이것은 당신이 어떤 조건이 당신의 관측 가능 성을 파괴해야하는지 앞에 설명 할 수있게 해줍니다. 예를 들면 :

this.clientService.clientStream$ 
    .takeUntil(Observable.timer(10000)) 
    .subscribe(client => this.client = client); 

내가()는 동 기적으로 당신에게 현재의 값을 줄 것이다

client.getValue라고합니다. 당신은 전혀 가입하지 않았습니다. 위로 측면에서, 이것은 당신이 구독을 취소 할 필요가 없음을 의미합니다. 그러나 단점은 왜 가치가 변하는지를 보지 않으려는 경우 행동 주제를 사용하는 이유입니까?

관련 문제