2017-12-20 156 views
7

Gözlemlenebilirden 3 son öğe almak istiyorum. benim zaman çizelgesi şöyle diyelim:RxJS - gözlemlenebilir bir son elemanın son elemanını al

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

burada: a, b, c, d, e, f, g, h, i, j are emitted values

yeni değer bunun böyle bakmak, böylece hemen almak istiyorum yayılan Ne zaman:

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

Bunun çok yararlı olduğunu düşünüyorum. En son 10 iletiyi görüntülemek istediğiniz bir sohbet oluşturmayı düşünün. Yeni bir mesaj geldiğinde, görünümünüzü güncellemek istersiniz.

girişimim: demo

cevap

11

Bunun için scan kullanabilirsiniz:

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); 

Bu yazdırır:

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

bufferCount istediğini yapmayacağım. Yalnızca her bir arabellek tam olarak === 3 olduğunda yayılacak, bu da en az 3 ileti yayınlayana kadar herhangi bir emisyon elde etmeyeceğiniz anlamına gelir.

+0

Doğru cevap için tekrar başvurun. –

+0

ile biraz daha var. Teşekkür ederim! Ben tam olarak ne ben – feerlay

+0

çok akıllı elde etmek istedim yapar! Bunun neden yerleşik bir operatör olmadığı hakkında bir fikrin var mı? RxJ'ler için tüm yaygın olmayan kullanım durumlarına isabet etmeliyim, çünkü daha önce oluşturulmamış bu gibi şeyleri aramaya devam ediyorum. –

4

Sen Observable#bufferCount fonksiyonu bakabilirsiniz. Bir fark, en az 3 kez yayılmasını istemesidir (bu örnekte ilk parametre).

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

Cevabınız için teşekkür ederiz! Tıpkı midein'den bahsettiği gibi, bufferCount sadece her tampon tam olarak === 3 – feerlay

+1

teşekkürler. Ayrıca, –

+0

'dan da bahsetmiştim 'source.next (null); source.next (boş); source.next (null); '[sic] –