2017-12-20 98 views
7

Tôi muốn lấy 3 phần tử cuối cùng từ một quan sát được. Hãy nói rằng thời gian của tôi trông như thế này:RxJS - lấy n thành phần cuối cùng từ một quan sát được

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

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

Bất cứ khi nào một giá trị mới được phát ra tôi muốn có được nó ngay lập tức, vì vậy nó có thể trông như thế này:

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

Tôi nghĩ rằng điều này cực kỳ hữu ích. Hãy tưởng tượng xây dựng một cuộc trò chuyện mà bạn muốn hiển thị 10 tin nhắn cuối cùng. Bất cứ khi nào một tin nhắn mới đến, bạn muốn cập nhật chế độ xem của mình.

nỗ lực của tôi: demo

Trả lời

11

Bạn có thể sử dụng scan cho việc này:

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

này sẽ in:

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

Các bufferCount sẽ không làm những gì bạn muốn. Nó sẽ phát ra chỉ khi mỗi bộ đệm chính xác là === 3 có nghĩa là bạn sẽ không nhận được bất kỳ phát xạ nào cho đến khi bạn đăng ít nhất 3 tin nhắn.

+0

Upvote cho câu trả lời đúng. Tôi có một chút khác với trường hợp thấp –

+0

Cảm ơn bạn! Nó thực hiện chính xác những gì tôi muốn đạt được – feerlay

+0

rất thông minh! Bất kỳ ý tưởng tại sao điều này không phải là một nhà điều hành được xây dựng? Tôi chỉ cần được đánh tất cả các trường hợp sử dụng phổ biến cho RxJs bởi vì tôi tiếp tục tìm kiếm những thứ như thế này mà chưa được xây dựng. –

4

Bạn có thể nhìn vào Observable#bufferCount chức năng. Một khác biệt là nó muốn ít nhất 3 lần để phát ra (tham số đầu tiên, trong ví dụ này).

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

Cảm ơn bạn đã trả lời! Giống như @martin đã đề cập, bufferCount chỉ phát ra khi mỗi bộ đệm chính xác là === 3 – feerlay

+1

Cảm ơn. Tôi cũng đã đề cập đến nó –

+0

Bạn có thể làm 'source.next (null); source.next (null); source.next (null); '[sic] –

Các vấn đề liên quan