2016-08-31 9 views
6

मेरे पास दो आरएक्सजेएस विषय हैं, a और b कहें कि मुझे किसी भी तरह गठबंधन करने की आवश्यकता है।दो आरएक्सजेएस धाराएं (सिंक्रनाइज़ पर आधारित) को मिलाएं

someComboOfAandB.subscribe({aVal, bVal} => console.log("value:", aVal, bVal)); 

मैं उन्हें इस तरह संयोजित करना चाहते हैं कि यदि a और b तुल्यकालिक अपडेट किया जाता है, मानों को एक साथ दिया जाता है:

a.next(1); 
// some code 
b.next(2) 

// at end of synchronous code/frame: 
// value: 1 2 

हालांकि, अगर सिर्फ़ एक मान अद्यतन किया जाता है, एक अद्यतन अभी भी आगे बढ़ा दिया जाएगा साथ ही साथ दो नए मानों के साथ एक अद्यतन धक्का दिया जाएगा:

a.next(5) 

// at end of synchronous code/frame: 
// value: 5 2 

क्या यह संभव है? यदि ऐसा है, तो कैसे? यहां तक ​​कि यदि यह संभव है, तो क्या यह कुछ ऐसा है जो टालना चाहिए?

+0

'combineLatest'? –

+0

http://reactivex.io/documentation/operators/combinelatest.html –

+0

@LukaJacobowitz समस्या यह है कि उपरोक्त पहले उदाहरण में दो अपडेट ट्रिगर हो जाएंगे, जो मेरे पास नहीं हो सकता है। – JKillian

उत्तर

2

आप इच्छित व्यवहार को प्रभावित करने में सक्षम उपयोग एक Scheduler होना चाहिए:

import "rxjs/add/observable/combineLatest"; 
import "rxjs/add/operator/map"; 

import { BehaviorSubject } from "rxjs/BehaviorSubject"; 
import { Observable } from "rxjs/Observable"; 
import { asap } from "rxjs/scheduler/asap"; 

let a = new BehaviorSubject(1); 
let b = new BehaviorSubject(2); 
let combined = Observable 
    .combineLatest(a, b, asap) 
    .map((values) => ({ aVal: values[0], bVal: values[1] })); 

combined.subscribe(
    ({ aVal, bVal }) => { console.log("value:", aVal, bVal); } 
); 

a.next(3); 
b.next(4); 

ऊपर कोड उत्पादन निम्नलिखित होगा:

value: 3 4 

तो asapScheduler निर्दिष्ट नहीं है, उत्पादन होगा:

value: 1 2 
value: 3 2 
value: 3 4 

आरएक्सजेएस गिटहब रेपो में कुछ Scheduler documentation शामिल हैं।

+0

दस्तावेज़ों के अनुसार, 'asap' "सूक्ष्म कार्य कतार पर अनुसूची, जो उपलब्ध सबसे तेज़ परिवहन तंत्र का उपयोग करता है, या तो ... वेब वर्कर संदेश चैनल या सेटटाइम या अन्य।" यह बहुत ही आशाजनक लगता है, मैं इसे आज कोशिश करूंगा – JKillian

+0

इसे मेरे कोड में आज़माएं, और दिलचस्प रूप से 'asap' काम नहीं किया, लेकिन' async' किया। मुझे लगता है कि मैं ब्राउज़र – JKillian

+0

हम्म के संदर्भ में दोनों के बीच के अंतर पर स्पष्ट नहीं हूं, यह निराशाजनक है - कभी-कभी ऐसा लगता है कि कभी-कभी ऐसा नहीं होता है। मेरे पास मूल रूप से मेरे कोड बेस में एक जगह है: 'लॉग ("स्टार्ट"); a.next (1); लॉग इन करें ("मध्य"); b.next (2); 'और मुझे' प्रारंभ करें "," सदस्यता अद्यतन "," मध्य "' मिलता है, जहां ग्राहक को 'a.next' के साथ सिंक्रनाइज़ रूप से अपडेट मिल जाता है। 'b.next' से पहले कहा जाता है। अन्य बार यह काम करता है हालांकि:/ – JKillian

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