2012-04-22 6 views
5

Ich habe dieses Tutorial node.js eventEmitter gemacht, es hat gut funktioniert. Ich habe eine Methode hinzugefügt, die http.request verwendet, um Daten zu erhalten, die funktionieren und die Daten ausgeben.node.js eventEmitter + http.request

das Problem ist, dass der Hörer das Ereignis nicht abfangen!

kann jemand helfen?

Code:

var events = require('events'); 
var util = require('util'); 
var http = require('http'); 

//http request options, it query the twitter api and get the public timeline, works! 
var options = { 
    hostname : 'api.twitter.com', 
    port : 80, 
    method : 'get', 
    path : '/1/statuses/public_timeline.json?count=3&include_entities=true' 
} 

// The Thing That Emits Event 
Eventer = function(){ 
    events.EventEmitter.call(this); 

//tutorial examples 
    this.kapow = function(){ 
    var data = "BATMAN" 
    this.emit('blamo', data); 
    } 

//tutorial examples 
    this.bam = function(){ 
    this.emit("boom"); 
    } 

//my method 
    this.GetTweetList = function(){ 
    var tweets = ""; 
     var req = http.request(options, function(response){ 
        var body = ""; 
        response.on('data',function(data){ 
         body += data; 
        }); 
        response.on('end', function(){ 
         tweets = JSON.parse(body); 
         this.emit("tweets", tweets); 
         util.puts('!!!!!!!!!! got some data !!!!!!!!!! \n'); 
        }); 
       }); 
     req.end(); 
    } 
}; 
util.inherits(Eventer, events.EventEmitter); 

// The thing that listens to, and handles, those events 
Listener = function(){ 

//tutorial examples 
this.blamoHandler = function(data){ 
    console.log("** blamo event handled"); 
    console.log(data); 
    }, 

//tutorial examples 
    this.boomHandler = function(data){ 
    console.log("** boom event handled"); 
    } 

//my listener method 
    this.GetTweetListHandler = function(data){ 
     console.log("** tweets event handled"); 
     util.put(data); 
     util.puts('!!!!!!!!!! got some data in listener !!!!!!!!!! \n'); 

    } 

}; 

// The thing that drives the two. 
//instanciating the object and liking the methodes 
var eventer = new Eventer(); 
var listener = new Listener(eventer); 
eventer.on('blamo', listener.blamoHandler); 
eventer.on('boom', listener.boomHandler); 
eventer.on('tweets', listener.GetTweetListHandler); 


//calling the methodes 
eventer.kapow();//works 
eventer.bam();//works 
setInterval(eventer.GetTweetList, 2000); 
//eventer.GetTweetList();// still waiting but the eventer display that he got the data 

Antwort

1

hart zu beschmutzen ...

Das Problem ist die this Zeiger von this.emit("tweets", tweets);. Sie führen diesen Aufruf aus einem an response.on übergebenen anonymen Rückruf aus, so dass this das Eventer Objekt nicht darstellt, das Sie erstellten. Um es zu lösen, müssen Sie den Zeiger this "speichern" (eine gängige Praxis).

var tweets = ""; 
var self = this; 
.... 
self.emit("tweets", tweets); 
+0

inded das war es, danke :) –

Verwandte Themen