【问题标题】:Nodejs events firing multiple timesNodejs事件多次触发
【发布时间】:2013-12-14 00:44:00
【问题描述】:

如果 server01 有消息进来,server01 和 server02 的消息事件都会被触发。我以为行

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

【问题讨论】:

    标签: javascript node.js events zeromq


    【解决方案1】:

    问题在于您管理继承的方式。正确的继承 JavaScript 代码是:

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

    【讨论】:

    • 感谢您的快速回复,我看了两眼才意识到这是如何工作的。代码现在按预期运行,再次感谢您
    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多