2017-12-20 51 views
7

से अंतिम तत्व ले लो मैं एक अवलोकन से 3 अंतिम तत्व लेना चाहता हूं। मान लीजिए कि मेरे समय इस तरह दिखता है:आरएक्सजेएस - एक अवलोकन योग्य

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

सही उत्तर के लिए उपरोक्त। मेरे पास कम मामला –

+0

के साथ थोड़ा सा है धन्यवाद! यह वही करता है जो मैं – feerlay

+0

को बहुत चालाक हासिल करना चाहता था! कोई विचार यह ऑपरेटर में निर्मित क्यों नहीं है? मुझे बस आरएक्सजे के लिए सभी असामान्य उपयोग मामलों को मारना होगा क्योंकि मैं इस तरह की चीजों की तलाश करता हूं जो पहले से ही निर्मित नहीं हैं। –

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

उत्तर के लिए धन्यवाद! जैसे @ मार्टिन ने उल्लेख किया है, बफर काउंटर केवल तभी निकलता है जब प्रत्येक बफर बिल्कुल === 3 – feerlay

+1

धन्यवाद। मैंने इसका उल्लेख भी किया है –

+0

आप 'source.next (शून्य) कर सकते हैं; source.next (शून्य); source.next (शून्य); '[sic] –

संबंधित मुद्दे