के लिए केवल पुश करें, मुझे CombineLatest
का संस्करण लागू करने की आवश्यकता है (मैं इसे WithLatest
यहां कॉल करूंगा) जो बाईं ओर प्रत्येक आइटम और दाईं ओर नवीनतम आइटम के लिए चयनकर्ता को कॉल करता है। इसे केवल सही परिवर्तन पर वस्तुओं के लिए धक्का नहीं देना चाहिए।CombineLatest, लेकिन बाएं
मुझे लगता है कि इस Observable.Create
बनाया गया है या मौजूदा एक्सटेंशन का एक संयोजन विशेष रूप से महत्वपूर्ण नहीं है कि; मैं इसे किसी भी तरह से "बॉक्सिंग" एक्सटेंशन विधि बनाउंगा।
उदाहरण
var left = new Subject<int>();
var right = new Subject<int>();
left.WithLatest(right, (l,r) => l + " " + r).Dump();
left.OnNext(1); // <1>
left.OnNext(2); // <2>
right.OnNext(1); // <3>
right.OnNext(2); // <4>
left.OnNext(3); // <5>
उपज चाहिए
2 1
3 2
संपादित: मेरे उदाहरण के तर्क जाता है:
- वाम के साथ 1. राइट खाली है आबादी वाले हो जाता है, कोई मूल्य धक्का नहीं दिया।
- बाएं 2 के साथ अपडेट हो जाता है (यह पिछले मान को भूल जाता है)। अभी भी खाली है, इसलिए कुछ भी धक्का नहीं दिया जाता है।
- दाएं 1 के साथ आबादी बन जाती है, इसलिए बाएं = 2 (नवीनतम मान), दायां = 1 धक्का दिया जाता है। इस बिंदु तक, वहाँ कोई अंतर नहीं
WithLatest
और - के बीच
CombineLatest
सही अद्यतन किया जाता है है - कुछ भी नहीं धकेल दिया जाता है। यह वही विभिन्न - वाम 3 के साथ अद्यतन किया जाता है है, तो वाम = 3, सही = 2 (नवीनतम मूल्य) धकेल दिया जाता है।
यह सुझाव हो गया है कि मैं कोशिश:
var lr = right.ObserveOn(Scheduler.TaskPool).Latest();
left.Select(l => l + " " + lr.First()).Dump();
लेकिन अपने परीक्षण के लिए मौजूदा धागे पर इस ब्लॉक।
आप केवल यह w/मौजूदा संयोजक करना चाहते हैं, या 'बनाना()' विकल्प का उपयोग करके कार्यान्वयन करना चाहते हैं? –
आपका उदाहरण उस मेल से मेल नहीं खाता है जो मैं आपके विवरण से अपेक्षा करता हूं। आपके उदाहरण में लौटाया गया पहला आइटम सही अवलोकन पर एक बदलाव से ट्रिगर किया जाता है। यदि पहले से ही बाएं से आइटम हैं तो पहले दाईं ओर 'withLatest' ट्रिगर करना चाहिए? –
@Gideon Engelberth: सहमत हैं। उसने मुझे भी परेशान कर दिया। विवरण के अनुसार, एल्गोरिदम केवल "3 2" उत्पन्न करना चाहिए। – 3dGrabber