2014-04-22 23 views
5

मैं आरएक्सजेएस को सिंक दुनिया के साथ घटनाओं की "पुल" एसिंक दुनिया में उपयोग करना चाहता हूं। विशेष रूप से मैं एक ऐसा फ़ंक्शन बनाना चाहता हूं जो कुछ समय अंतराल के दौरान एकत्रित घटनाओं की एक सरणी देता है।आरएक्सजेएस को अवलोकन करने के लिए अवलोकन

मैं जो करता है जो मैं चाहता

var source = Rx.Observable 
.interval(100 /* ms */) 
.bufferWithTime(1000).take(1) 

मैं ठीक सही मान मुद्रित कर सकते हैं प्रत्यक्ष बना सकते हैं

var subscription = source.subscribe(
    function (x) { 
     console.log('Next: ' + JSON.stringify(x)); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

यह

[0,1,2,3,4,5,6,7,8] 
Completed 

प्रिंट लेकिन चाहते हैं मैं चाहता हूँ आवंटित करने के लिए है चर के लिए यह सरणी। सैद्धांतिक रूप मैं चाहता हूँ

var collectedDuringSecond = source.toPromise.getValue()

विचार की तरह कुछ है कि getValue तो ब्लॉक कर देगा के बाद उपरोक्त पंक्ति किया जाता है collectedDuringSecond शामिल होंगे है [0,1,2,3,4,5,6,7,8]

+1

पहले, जावास्क्रिप्ट में अवरुद्ध करना सबसे अच्छा विचार नहीं है। आरएक्स विशेष रूप से आपको एसिंक्रोनस प्रोग्रामिंग द्वारा पेश किए गए बहुत से दर्द से बचने की अनुमति देता है, तो आप मूल्य प्राप्त करने के लिए क्यों ब्लॉक करना चाहते हैं? –

+0

मैं जावास्क्रिप्ट के लिए नया हूं, इसलिए आप सही हो सकते हैं कि मैं अवरुद्ध नहीं करना चाहता हूं;)। असल में, इस विशेष डेटा सेट काफी भी स्थिर यह एक वितरण तंत्र के रूप घटनाओं का उपयोग करता है। इस प्रकार मैं एपीआई क्लाइंट को "सरल" सिंक्रोनस एपीआई का पर्दाफाश करना चाहता था। अपनी टिप्पणी के आधार पर मैं शायद पर पुनर्विचार करना चाहिए और सिर्फ प्रत्यक्ष लौट सकते हैं और ग्राहक की घटनाओं को किसी भी तरह वे चाहते हैं – apolenur

+0

निश्चित रूप से एक बेहतर तरीका है कि उपभोग करते हैं। * यदि * किसी कारण से (मैं नहीं जानता कि क्यों) आप आरएक्स को छिपाने के लिए करना चाहता था, आप के बजाय उजागर की एक नोड शैली कॉलबैक ('समारोह (अरे, मूल्य) {...}') के साथ अपने एपीआई प्रदान कर सकता है नमूदार। हालांकि, मैं, सार्वजनिक एपीआई के भाग के रूप नमूदार उजागर क्योंकि वे हमेशा से ही 'उस वस्तु को subscribe' कर सकते हैं, बजाय खुद फोन एपीआई पर कॉलबैक उपलब्ध कराने के सुझाव है। –

उत्तर

6

जावास्क्रिप्ट में सिंक्रोनस इवेंट प्रोग्रामिंग अत्यधिक प्रतिबंधित है। वास्तव में, यह कई मामलों में असंभव हो सकता है। मैंने आरएक्स के साथ हैकिंग करने की कोशिश की ताकि यह देखने के लिए कि क्या मैं आरएक्स स्रोत को संशोधित किए बिना एक सिंक्रोनस इंटरफ़ेस प्रदान कर सकता हूं, और (अच्छे कारण के लिए) सीधे जावास्क्रिप्ट के साथ यह संभव नहीं है।

मैं अपने एपीआई के भाग के रूप नमूदार उजागर, और उपभोक्ताओं वहां से इसे संभाल करने के लिए अनुमति सुझाव है (कुहनी से हलका धक्का निश्चित रूप से आरएक्स, उपयोग करने के लिए के साथ;)।

function MyClass() { 

    this.getArrayOfStuffAsObservable = function() { 
     return Rx.Observable.interval(100) 
      .bufferWithTime(1000).take(1); 
    }; 

    // this is optional and I don't recommend it, since you already have Rx available. 
    // additionally, consumers will probably miss the fact that you can dispose 
    // of the subscription. 
    this.getArrayOfStuff = function (callback) { 
     var value; 
     return this.getArrayOfStuffAsObservable() 
      .subscribe(
       function (x) { 
        value = x; 
       }, 
       function (err) { 
        callback(err); 
       }, 
       function() { 
        if (hasValue) { 
         callback(undefined, value); 
        } else { 
         callback('did not receive value'); 
        } 
       }); 

    }; 
}; 

एक अतिरिक्त नोट के रूप में, तो आप इस विशिष्ट उदाहरण के लिए take बजाय bufferWithTime साथ संयोजन के रूप में toArray उपयोग कर सकते हैं (यह एक ही बात करने का वास्तव में दो तरह से है, लेकिन एक बार और पर आधारित है अन्य आइटम गिनती के आधार पर)। toArray एक अवलोकन योग्य बनाता है जो अंतर्निहित पर्यवेक्षण के सभी मूल्यों को एकत्र करेगा, और अंतर्निहित पर्यवेक्षण पूर्ण होने पर उन मानों को सरणी के रूप में उपज देगा।

this.getArrayOfStuffAsObservable = function() { 
    return Rx.Observable.interval(100) 
     .take(10) 
     .toArray(); 
}; 
संबंधित मुद्दे