node.js eventEmitter + http.request

我做了这个教程node.js eventEmitter ,它很好地工作。 我添加了一个方法,使用http.request来获取数据,它的工作和发出的数据。

问题在于听众不能理解事件!

有人可以帮忙吗?

代码:

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 

很难find…

问题是this.emit("tweets", tweets);指针this.emit("tweets", tweets); 。 您正在通过传递给response.on的匿名callback来执行此调用,因此this不代表您创build的Eventer对象。 要解决这个问题,你需要“保存” this指针(通常的做法)。

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