2016-08-01 8 views
2

값의 상한값과 상한값을 사용하여 제한하는 값의 스트림이 있으며, 값이 변경되면 값만 내보내고 싶습니다. 이 문제는 다음 코드에서 두 번째로 distinctUntilChanged() 여전히 중복을 생산한다는 것입니다 :RxJs : distinctUntilChanged 여전히 중복 값을 내 보냅니다.

Observable // emits i.e. [2, 2, 2, 5, 5, 10, 20] 
.distinctUntilChanged() // becomes [2, 5, 10, 20] 
.map(target => { 
    const correctedTarget = Math.min(Math.max(target, MINIMUM), MAXIMUM); // Let's say min: 5, max: 10 
    if(correctedTarget != target) { 
    logger.warn(`Prediction wants to scale out-of-bounds to ${target}, limiting to ${correctedTarget}`); 
    } 
    return correctedTarget; 
}) // becomes [5, 5, 10, 10] 
.distinctUntilChanged() // should be [5, 10], but is [5, 5, 10, 10] 

RxJs의 문서는 간단한 평등 비교에 필터 기본값, 그래서이 그냥 작동 ™ 것을 기대하는 것을 주장.

+1

값이 순서대로 올 수 있다는 것을 완전히 확신합니까? 나는 당신의 코드를 가져 와서 rxjs 4와 비교해 보았고 모든 것이 완벽하게 작동했다. –

+0

그래, 마지막 줄 전후에'.do (val => {logger.debug (value);})'를 추가하면 같은 값을 계속 출력하는지 확인할 수있다. – Sander

+1

확인. 이 문제를 보여주는 샘플 코드를 게시 할 수 있습니까? 사용중인 rxjs 버전을 게시 할 수 있습니까? 내가 말했듯이, 빠른 샘플 변환은 제대로 작동했습니다. –

답변

0

제 동료 중 한 명 (다시 한번)이 문제를 확인했습니다 (도움을 주신 덕분에 Matt). 그것은 초기 가정이 틀렸다는 것이 밝혀 - 다음과 같이 코드의 윤곽이 있었다 : 당신이 볼 수 있듯이

Observable // emits credentials on some interval 
.flatmap(credentials => { 
    return Observable2.doSomething() 
     .distinctUntilChanged() 
     ... 
}) 

distinctUntilChanged가 자격 증명을 방출받을 때마다 새로운 관찰 스트림 인 Observable2 체인되었다 . 이것은 또한 내가 만든 비교 함수가 전혀 호출되지 않는 이유를 설명합니다. 매번 하나의 값만 있으므로 비교할 것이 없습니다.