2017-05-16 6 views
1

Observables에 대한 완전한 이해를 바탕으로 전적으로 문제가 있습니다.Observables를 사용하여 Angular2에서 각각 대기열에있는 이벤트의 대상을 처리합니다.

이것은 rx/js 및 Observables를 사용하는 Angular2 (v4.0.3) 프로젝트입니다.

나는 상태 서비스에서 이벤트를 보유 상태 저장소 있습니다

// Observable string sources 
    private currentEventStore = new BehaviorSubject<string>(""); 

    // Observable string streams 
    public currentEvent$ = this.currentEventStore.asObservable(); 

    // Service message commands 
    setCurrentEvent(nextEvent: string) { 
    this.currentEventStore.next(nextEvent); 
    } 

내 구성 요소에 currentEvent $에 가입 이벤트를 수신하기를 한 다음에 행동한다.

this.stateSvc.currentEvent$ 
    .subscribe(
    currentEvent => { 
    this.currentEvent = currentEvent; 
    if (currentEvent != '') { 
     this.handleCurrentEvent(currentEvent); 
    } 
    }); 

제가하는 데 문제는 내가 '만들기'이벤트를 생성 할 때, 내 구독 기능은 이벤트를 선택하고를 생성하도록 저장소, 모든 이벤트를 축적하고 그들 모두에게 때마다 반환하는 것입니다 record - 첫 번째 패스에는 완벽하지만 두 번째 'create'이벤트가 생성되면 구독 된 함수는 2 개의 이벤트를 선택하고 2 개의 레코드를 만들고 다음 'create'이벤트에서 3 개의 레코드를 만드는 등의 작업을 수행합니다.

내가해야 할 일은 currentEvent $ store가 처리되지 않은 이벤트 만 포함 할 수 있도록 이벤트가 스트림에서 플러시되는 것입니다.

저장소를 플러시 할 수있는 방법이 있습니까? 아니면 내 기대와 구현에 여기에 실종 된 것이 있습니까?

+2

'BehaviorSubject'가 수행하는 유일한 작업은 각 관찰자에게 구독시 전송되는 기본값을가집니다 (즉,'ReplaySubject '가하는 것입니다). 그것은 문제가 어딘가에 있고 BehaviorSubject를 사용하지 않고있는 값들을 저장하지 않습니다. – martin

답변

0

종종 문제가 될 수도 있습니다. 질문을 게시 한 지 몇 시간 만에 답변을 찾으십시오.

여기서 문제는 구독자를 등록하는 구성 요소를 다시 방문 할 때마다 관찰자에게 새로운 구독자를 추가하므로 두 번째 방문시 두 명의 구독자가 있고 각 이벤트가 발생하므로 이벤트가 발생합니다. 두 번 처리했습니다. 세 번째로 돌아 오면 구독자가 세 명이므로 이벤트가 세 번 처리됩니다.

내가해야 할 일은 구독에 수정을 적용하여 변수에 할당 한 다음 구성 요소를 삭제하면 가입을 취소하는 것입니다.

그래서 (같이 의 추가를주의해야한다 구독 'this.observeEvent =' :

this.observeEvent = this.stateSvc.currentEvent$ 
    .subscribe(
    currentEvent => { 
    this.currentEvent = currentEvent; 
    if (currentEvent != '') { 
     this.handleCurrentEvent(currentEvent); 
    } 
    }); 

그리고 구성 요소에 이것을 추가 :

ngOnDestroy() { 
    this.observeEvent.unsubscribe(); 
} 

를 등록 해제 구독자가이 구성 요소가로드 될 때마다 누적되지 않습니다.

이 방법을 수행하는 방법을 알아 내려고 노력했습니다. b ut Observable을 인스턴스 변수에 할당하지 않고 ngOnDestroy 메소드에서 탈퇴 할 유효한 구문을 찾을 수 없었습니다.