节点JS事件未触发

时间:2015-06-25 14:26:43

标签: javascript node.js

我正在尝试在我的节点JS代码中触发事件,但无法解决为什么它不是。

我有一个模块如下:

var zookeeper = require('node-zookeeper-client'),
    events = require('events'),
    util = require('util');
var client;

var KafkaZookeeperMonitor = function(){
    events.EventEmitter.call(this);  
}

util.inherits(KafkaZookeeperMonitor, events.EventEmitter);

KafkaZookeeperMonitor.prototype.connectToZk = function(zookeepers){
    client = zookeeper.createClient(zookeepers);
    client.connect();

    client.once('connected', function () {
        console.log('Connected to ZooKeeper');
        this.emit('connected');
    });
}

module.exports = KafkaZookeeperMonitor;

我从index.js文件中调用它,如下所示:

var KafkaZookeeperMonitor = require('./kafkaZookeeperMonitor'),
    kafkaStatus = new KafkaZookeeperMonitor(),
    brokerPath = '/brokers/ids';

kafkaStatus.connectToZk('192.168.50.252:2181');

kafkaStatus.once('connected', function(){
    console.log('watcher connected to Zookeeper');
})

当我运行代码时,我得到了日志消息

  

'连接到Zookeeper'

this.emit('connected');似乎没有发射。

我在网上浏览过,我想我正确地设置了我的事件发射器。任何人都可以帮我解决我在这里可能出错的地方吗?

由于

2 个答案:

答案 0 :(得分:3)

回调函数的上下文不是KafkaZookeeperMonitorz对象,因此this实际上不是Object实例。

这应该有效:

KafkaZookeeperMonitor.prototype.connectToZk = function(zookeepers){
  var self = this;
  client = zookeeper.createClient(zookeepers);
  client.connect();

  client.once('connected', function () {
      console.log('Connected to ZooKeeper');
      self.emit('connected');
  });
}

它没有抛出错误的原因可能是因为client也在扩展EventEmitter

答案 1 :(得分:1)

我不相信'这'是你认为的......

this.emit('connected');

调试并确保你的“这个”正是你要找的......

http://javascriptplayground.com/blog/2012/04/javascript-variable-scope-this/