2017-12-20 7 views
7

観測対象から最後の3つの要素を取りたいと思う。のは、私のタイムラインは、このようになっていることを言ってみましょう:RxJS - 観測対象から最後のn個の要素を取り出す

--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機能で見ることができます。 1つの違いは、少なくとも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] –

関連する問題