2012-04-22 20 views
5

tôi đã làm hướng dẫn này node.js eventEmitter, nó hoạt động tốt. Tôi đã thêm một phương thức sử dụng http.request để lấy dữ liệu, hoạt động và phát ra dữ liệu.sự kiện node.jsEmitter + http.request

vấn đề là người nghe không bắt sự kiện!

ai đó có thể trợ giúp?

mã:

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 

Trả lời

1

một cứng để phát hiện ...

Vấn đề là con trỏ this từ this.emit("tweets", tweets);. Bạn đang thực hiện cuộc gọi này từ trong một cuộc gọi lại ẩn danh được chuyển đến response.on, vì vậy this không đại diện cho đối tượng Eventer mà bạn đã tạo. Để giải quyết nó, bạn cần phải "lưu" con trỏ this (một thực tế phổ biến).

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

đã nhận diện điều đó, cảm ơn :) –

Các vấn đề liên quan