जैसा कि आपने इस प्रश्न में उल्लेख किया है, यह कई पर्यवेक्षकों के साथ पूरा किया जा सकता है। संक्षेप में, आपके पास दो अवलोकन हैं: "ताजा प्रतिक्रिया" देखी जा सकती है, और "कैश प्रतिक्रिया" देखी जा सकती है। अगर कुछ "मनाया जा सकता है", तो आप इसे एक अवलोकन के रूप में व्यक्त कर सकते हैं। आइए पहले नाम original
और दूसरा replayed
नाम दें।
यह JSBin देखें (जावास्क्रिप्ट लेकिन अवधारणाओं का सीधे जावा में अनुवाद किया जा सकता है। जहां तक मुझे पता है, जावाबिन नहीं है)।
var original = Rx.Observable.interval(1000)
.map(function (x) { return {value: x, from: 'original'}; })
.take(4)
.publish().refCount();
var replayed = original
.map(function (x) { return {value: x.value, from: 'replayed'}; })
.replay(null, 1).refCount();
var merged = Rx.Observable.merge(original, replayed)
.replay(null, 1).refCount()
.distinctUntilChanged(function (obj) { return obj.value; });
console.log('subscribe 1st');
merged.subscribe(function (x) {
console.log('subscriber1: value ' + x.value + ', from: ' + x.from);
});
setTimeout(function() {
console.log(' subscribe 2nd');
merged.subscribe(function (x) {
console.log(' subscriber2: value ' + x.value + ', from: ' + x.from);
});
}, 2500);
यहां समग्र विचार है: एक क्षेत्र from
अपने मूल का संकेत के साथ घटना पर टिप्पणी करें। यदि यह original
है, तो यह एक ताजा प्रतिक्रिया है। यदि यह replayed
है, तो यह एक कैश प्रतिक्रिया है। अवलोकन original
केवल from: 'original'
उत्सर्जित करेगा और अवलोकन replayed
केवल from: 'replayed'
उत्सर्जित करेगा। जावा में हमें थोड़ी अधिक बॉयलरप्लेट की आवश्यकता होगी क्योंकि आपको इन एनोटेटेड घटनाओं का प्रतिनिधित्व करने के लिए कक्षा बनाने की आवश्यकता है। अन्यथा आरएक्सजेएस में एक ही ऑपरेटरों को आरएक्सजेवा में पाया जा सकता है।
मूल पर्यवेक्षण publish().refCount()
है क्योंकि हम सभी पर्यवेक्षकों के साथ साझा करने के लिए इस स्ट्रीम का केवल एक उदाहरण चाहते हैं। वास्तव में आरएक्सजेएस और आरएक्स.नेट में, share()
publish().refCount()
के लिए उपनाम है।
रीप्लेड ऑब्जर्जेबल replay(1).refCount()
है क्योंकि इसे मूल की तरह भी साझा किया जाता है, लेकिन replay(1)
हमें कैशिंग व्यवहार देता है।
merged
अवलोकन करने योग्य दोनों मूल और पुनः चलाए गए हैं, और यही आपको सभी ग्राहकों के सामने खुलासा करना चाहिए। चूंकि replayed
तत्काल उत्सर्जित हो जाएगा जब भी original
करता है, हम तत्काल अनदेखा करने के लिए ईवेंट के मान पर distinctUntilChanged
का उपयोग करते हैं। कारण हम replay(1).refCount()
भी विलय है क्योंकि हम सभी पर्यवेक्षकों के बीच साझा की गई स्ट्रीम का एक साझा साझा उदाहरण होने के लिए मूल और रीप्ले के विलय को भी चाहते हैं। इस उद्देश्य के लिए हमने publish().refCount()
का उपयोग किया होगा, लेकिन हम replayed
में रीप्ले प्रभाव को खो नहीं सकते हैं, इसलिए यह replay(1).refCount()
है, publish().refCount()
नहीं है।
प्रश्न को स्पष्ट करने के लिए ... के बाद पहला आइटम BehaviorSubject को दिया जाता है, ग्राहकों को हमेशा कैश्ड संस्करण और फिर किसी भी नए अद्यतन प्राप्त करेंगे आवश्यकता। तो शायद सवाल यह है कि क्या इसे किसी के सामने देखा गया है? – benjchristensen