2013-12-13 225 views
0

如果有一條消息進入server01,server01和server02的消息事件都將被觸發。我覺得行Nodejs事件觸發多次

Socket.prototype = new events.EventEmitter; 

會導致完全地單獨的事件實例

感謝您的幫助!

var events = require('events'); 
var uuid = require('uuid'); 

// Server class 
function Socket (host) { 
    var self = this; 

    self.options = { 
    "serverHost": host, 
    "serverName": "server", 
    "clientName": uuid.v4() 
    }; 

    self.socket = new require('zmq').socket('router'); 
    self.socket.identity = self.options.clientName; 
    self.socket.connect('tcp://' + self.options.serverHost); 

    self.socket.on('message', function (sender, data) { 
    console.log('Sender: %s', self.options.clientName); 
    console.log('Data: %s', data.toString()); 
    self.emit('message', sender, data); 
    }); 

    setInterval(function() { 
    self.socket.send([self.options.serverName, uuid.v4()]); 
    }, 5000); 

    self.send = function (obj, callback) { 
    var status = true; 

    if(obj !== 'object') { 
     status = false; 
    } else { 
     self.socket.send([self.options.serverName, obj]); 
    } 

    if(callback === 'function') { 
    callback(status); 
    } else { 
     return status; 
    }; 
    }; 
}; 

Socket.prototype = new events.EventEmitter; 

// Userland 

var server01 = new Socket('127.0.0.1:3000'); 

server01.on('message', function (sender, data) { 
    console.log('Server01: %s', data.toString()); 
}); 

var server02 = new Socket('127.0.0.1:3000'); 

server02.on('message', function (sender, data) { 
    console.log('Server02: %s', data.toString()); 
}); 

下面是輸出的一個例子,從這個腳本

Sender: 14d36a66-a4e7-484a-9ce0-3f0d368a6986 
Data: 03e6bb47-6af0-4700-9b95-7bbc310477f6 
Server01: 03e6bb47-6af0-4700-9b95-7bbc310477f6 
Server02: 03e6bb47-6af0-4700-9b95-7bbc310477f6 
Sender: 59ec292e-abd2-4c9f-ac3e-2bf92c656fde 
Data: d66cd320-c3f2-4842-b66b-1d89f656d32f 
Server01: d66cd320-c3f2-4842-b66b-1d89f656d32f 
Server02: d66cd320-c3f2-4842-b66b-1d89f656d32f 

回答

1

問題是你管理的繼承方式。正確的JavaScript代碼繼承是:

Socket.prototype = Object.create(EventEmitter.prototype); 
+0

感謝您的快速回復,我花了兩個看起來才明白這是如何工作的。代碼現在按預期運行,再次感謝你 – Nekinie