2017-12-20 11 views
7

관측 가능한 마지막 원소를 3 개 가지고 싶다. 의 내 타임 라인이 같다고 가정 해 봅시다 :RxJS - 관측 가능한 마지막 원소를 받아 들인다.

--a---b-c---d---e---f-g-h-i------j->

여기서 a, b, c, d, e, f, g, h, i, j are emitted values

새 값이 나는 그것을 같이 할 수 있도록 즉시 싶어 방출 될 때마다 :

[a] 
[a, b] 
[a, b, c] 
[b, c, d] 
[c, d, e] 
[d, e, f] 
[e, f, g] 
[f, g, h] 
... and so on 

나는 이것이 매우 유용하다고 생각한다. 마지막 메시지 10 개를 표시하려는 채팅을 작성한다고 가정 해보십시오. 새 메시지가 올 때마다보기를 업데이트하려고합니다.

내 시도 : demo

답변

11

이에 대한 scan를 사용할 수 있습니다

Observable.from(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u']) 
    .scan((acc, val) => { 
    acc.push(val); 
    return acc.slice(-3); 
    }, []) 
    .subscribe(console.log); 

이 인쇄됩니다 :

[ 'a' ] 
[ 'a', 'b' ] 
[ 'a', 'b', 'c' ] 
[ 'b', 'c', 'd' ] 
[ 'c', 'd', 'e' ] 
... 
[ 's', 't', 'u' ] 

bufferCount 당신이 원하는 것을하지 않습니다. 각 버퍼가 정확하게 === 3 일 때만 방출됩니다. 즉, 적어도 3 개의 메시지를 게시 할 때까지 방출되지 않습니다.

+0

정답은 Upvote입니다. 나는 소문으로 조금 다른 것을 가지고있다 –

+0

고마워! 그것은 정확히 내가 달성하기를 원하는 것입니다 – feerlay

+0

매우 똑똑! 이것이 왜 빌트인 오퍼레이터가 아닌지 어떤 생각입니까? RxJ에 대한 흔하지 않은 사용 사례를 모두 치고 있어야합니다. 이미 내장되어 있지 않은 것을 계속 찾고 있기 때문입니다. –

4

당신은 Observable#bufferCount 기능을 볼 수 있습니다. 한 가지 차이점은 적어도 3 번 방출해야한다는 것입니다 (이 예에서 첫 번째 매개 변수).

const source = Rx.Observable.interval(1000); 
 
const example = source.bufferCount(3,1) 
 
const subscribe = example.subscribe(val => console.log(val));
<script src="https://unpkg.com/@reactivex/[email protected]/dist/global/Rx.js"></script>

+0

답변 해 주셔서 감사합니다. @martin이 언급 한 것처럼 bufferCount는 각 버퍼가 정확히 === 3 일 때만 방출합니다. – feerlay

+1

감사합니다. 나는 또한 그것을 언급했다 –

+0

당신은'source.next (null); source.next (null); source.next (null);'[sic] –