2015-03-12 6 views
6

का उपयोग करके वादे और स्ट्रीम मैं वचन और नोड के लिए नया सुपर नया हूं और धाराओं के साथ वादे का उपयोग करने के बारे में उत्सुक हूं। क्या मैं एक धारा को बढ़ावा दे सकता हूं? Bluebirdjs और निंदा मॉड्यूल मैं निम्नलिखित का उपयोग करना:Bluebird.js और ट्विटर स्ट्रीम

var Twit = require('twit') 
var Promise = require("bluebird"); 

var T = new Twit({ 
consumer_key:   process.env.CONSUMER_KEY, 
consumer_secret:  process.env.CONSUMER_SECRET, 
access_token:   process.env.ACCESS_TOKEN, 
access_token_secret: process.env.ACCESS_TOKEN_SECRET 
}) 

Promise.promisifyAll(Twit); 
Promise.promisifyAll(T); 

var sanFrancisco = [ '-122.75', '36.8', '-121.75', '37.8' ] 

T.streamAsync('statuses/filter', { locations: sanFrancisco }) 
.then(function(connection){ 
connection.onAsync('tweet') 
    .then(function (tweet) { 
    console.log(tweet) 
    }) 
}); 

इस कोड रनिंग ट्वीट लॉग नहीं और कोई त्रुटि फेंक दिया है। ऐसा कुछ भी नहीं होता है जब कनेक्शन बनाया जाता है लेकिन कोई भी काम नहीं करता है।

मूल टुकड़ा, twit docs

var sanFrancisco = [ '-122.75', '36.8', '-121.75', '37.8' ] 

var stream = T.stream('statuses/filter', { locations: sanFrancisco }) 

stream.on('tweet', function (tweet) { 
console.log(tweet) 
}) 
+1

मुझे नहीं लगता कि आपको प्रख्यात ईवेंट श्रोताओं का उपयोग करना चाहिए। हालांकि मैं गलत हो सकता था, मैंने इसे कभी भी इस तरह इस्तेमाल नहीं किया है। –

+0

[EventEmitters के साथ वादे का उपयोग] पर एक नज़र डालें [http://stackoverflow.com/a/24945351/1048572) (हालांकि यह केवल समाप्त होने वाली धारा के लिए सार्थक है)। – Bergi

+1

वे वेरिएबल्स देखें जो वे स्ट्रीम करते हैं - उदाहरण के लिए आरएक्सजेएस और बेकनजेएस। –

उत्तर

11

में पाया वादों को लागू करने के प्रयास करने से पहले मैं कहना है कि काम नहीं करेगा, एक वादा और एक धारा में एक बुनियादी अंतर की वजह से माफी चाहता हूँ। आप कहते हैं कि आप दोनों के लिए नए हैं, तो मैं आपको दोनों को संक्षिप्त परिचय देता हूं।

वादे को कुछ एकल मूल्य के लिए प्लेसहोल्डर्स के रूप में देखा जा सकता है जो शायद अभी तक नहीं पहुंचे हैं। उदाहरण के लिए, कुछ काल्पनिक समारोह getTweet() इस तरह काम कर सकता था:

getTweet() 
    .then(function (tweet) { 
     //Do something with your tweet! 
     console.log(tweet); 
    }); 

लेकिन यह आप सिर्फ एक ट्वीट मिलेगा! एक और प्राप्त करने के लिए, आपको इसके पीछे .then() के साथ getTweet() पर कॉल करना होगा। असल में, वादे के साथ काम करते समय आपको गारंटी है कि .then() केवल एक ही समय में इसके युक्त फ़ंक्शन को कॉल करता है!

स्ट्रीम डेटा के लगातार प्रवाह होते हैं। आपको मैन्युअल रूप से एक ट्वीट के लिए पूछना नहीं है, और फिर दूसरा, और फिर दूसरा। आप टैप खोलते हैं, और फिर यह तब तक आ रहा है जब तक कि यह समाप्त न हो जाए या आप इसे रोकने के लिए कहें।

तो, संक्षेप में, आप एक स्ट्रीम को प्रचारित नहीं कर सकते हैं, क्योंकि वादे डेटा के निरंतर प्रवाह के लिए एकल मूल्यों और धाराओं के लिए हैं।

मुझे लगता है कि आपने सवाल पूछा क्योंकि आपको वादा इंटरफ़ेस पसंद है और स्ट्रीम के लिए कुछ ऐसा उपयोग करना चाहते हैं? आप जो हासिल करने की कोशिश कर रहे हैं उसके आधार पर, विभिन्न पुस्तकालय हैं जो धाराओं के साथ काम कर सकते हैं। EventStream एक उदाहरण है। मुझे बताएं कि आप क्या योजना बना रहे हैं और मैं आपको एक उदाहरण देने में सक्षम हूं।

+0

धन्यवाद! मैं वादा इंटरफेस की तरह करता हूँ। मैंने मुख्य रूप से वादे के बारे में जानने के लिए यह अभ्यास किया था और जब उनका उपयोग किया जाना चाहिए और जब उनका उपयोग नहीं किया जाना चाहिए। मैं धीरे-धीरे कॉलबैक नरक छोड़ने और वादे की सुंदर दुनिया में प्रवेश करने का प्रयास कर रहा हूं। – srm

+0

स्ट्रीम बनाम वादा का अच्छा स्पष्टीकरण। संदर्भ में चीजें डालता है। –

1

क्या मैं स्ट्रीम स्ट्रीम कर सकता हूं?

नहीं। जबकि एक धारा लगातार घटनाओं को उत्सर्जित करती है, एक वादा केवल एक बार हल होता है। उनके पास पूरी तरह से अलग अर्थशास्त्र हैं (भले ही दोनों एसिंक्रोनस कॉलबैक का उपयोग करें)।

आप समाप्त होने वाली धारा के लिए एक वादा कर सकते हैं, EventEmitterPromisifier example in BlueBirds documentation देखें - लेकिन यह नहीं है कि आपका ट्विटर स्ट्रीम उदाहरण क्या करता है।

इस कोड को चलाने से कोई ट्वीट नहीं निकलता है और कोई त्रुटि नहीं फेंक दी जाती है।

क्योंकि T.stream() एक सिंक्रोनस फैक्ट्री फ़ंक्शन है जो स्ट्रीम ऑब्जेक्ट देता है। आपको इसकी आवश्यकता नहीं है - आप नहीं कर सकते - streamAsync का उपयोग करें, क्योंकि यह कभी भी पूर्ण रूप से पास किए गए कॉलबैक का आह्वान नहीं करेगा।

4

मैं RxJSstreams के साथ अवलोकन करने वाले लागू करने का उपयोग कर समाप्त हुआ।

var sanFrancisco = [ '-122.75', '36.8', '-121.75', '37.8' ] 

var stream = T.stream('statuses/filter', { locations: sanFrancisco }); 

var source = Rx.Node.fromEvent(stream, 'tweet'); 

var observer = Rx.Observer.create(
    function (tweet) { 
     // THIS IS WHERE EACH TWEET SHOULD COME FROM THE STREAM 
     console.log(tweet); 
    }, 
    function (err) { 
     console.log('Error getting tweets: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    } 
); 

source.subscribe(observer); 

मैं Rx.Node.fromStream के बजाय RX.Observable.fromEvent उपयोग करने के लिए क्योंकि, निंदा मॉड्यूल पर्दे के पीछे असली स्ट्रीम संभाल चाहिए होने लेकिन के माध्यम से और यह उजागर EventEmitter समाप्त हो गया, वे शायद नहीं करना चाहिए इसे टी.स्ट्रीम नाम दिया है।

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