2014-11-14 48 views
0

發射事件我有一個使用,我試圖編輯發出的事件插座一個圖書館,廣泛的代碼如下所示:在Node.js的

function Library(port, host) { 
    this.myData = []; 
    this.socket = net.connect(...); 
    this.socket.on('data', this._ondata.bind(this)); 
    this.socket.on('error', this._onerror.bind(this)); 
    this.socket.on('close', this._onclose.bind(this)); 
} 
Library.prototype._ondata = function() { 
    //do stuff 
    //have the data we want 
    this.myData.push(stuff); 
    this.socket.end(); 
} 
Library.protoype._onclose = function() { 
    console.log('this gets logged'); 
} 
modules.export = Library; 

我想發出一個事件該_onclose方法,這樣我可以做類似

var lib = new Library(port, host); 
lib.on('emitted-event', function() { 
    var data = lib.myData; 
}); 

,因爲如果我只是訪問lib.myData直線距離它仍然是一個空數組。但我正在努力發出一個事件。目前我得到的是圖書館沒有辦法。很顯然,我不是以正確的方式添加發射器。任何人都知道那是什麼?

+1

http://www.sitepoint.com/nodejs-events-and-eventemitter/ – bryanmac 2014-11-14 13:11:59

+0

'this.MyData.push(東西);'應該是'this.myData.push(東西); ' – SergioFilhow 2014-11-14 13:18:02

回答

0

您需要使用Node內置的事件庫。

var EventEmitter = require('events').EventEmitter, 
    util = require('util'); 

function Library(port, host) { 
    (...) 
} 

Library.protoype._onclose() = function() { 
    this.emit('emitted-event'); 
} 

util.inherits(Library, EventEmitter); 

然後,你會怎麼做:

var lib = new Library(port, host); 
lib.on('emitted-event', function() { 
    var data = lib.myData; 
}); 
+0

好的,儘管它會變得比我更復雜。 'this.socket'行是'this.socket = net.connect(port,host,this._onsocketConnected.bind(this));'並且在TypeError中添加了你所建議的結果''不能調用方法'bind'未定義的。所以'Library.prototype._onsocketConnected()'沒有被定義? – 2014-11-14 13:40:02

+0

你在用'new'調用你的構造函數嗎?自從原型成爲構造函數的一部分以來,你需要做的是什麼。 – 2014-11-14 13:42:08

+0

是的,我想,在庫本身中添加一個返回'this.myData'的方法可能更容易,但只有在套接字關閉時纔可以。然後我會做'var lib = new Library(...); var data = lib.getData();'也許這會更容易。 – 2014-11-14 13:45:38

0

奔財富的答案會工作。 Howeever:

var EventEmitter = require('events').EventEmitter 
var util = require('util') 

function Library(port, host){ 
    var self = this; //probably want to add this. if you call from any other function you want proper "this" 
    EventEmitter.call(this); 
    ... 
    var myobj = { eaten: [burger, fries] }; 
    self.emit('blurp', myobj); 
} 
util.inherits(Library, EventEmitter) 
exports = module.exports = Library; // or new Library(); if you want a singleton