我正在尝试在我的节点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');
似乎没有发射。
我在网上浏览过,我想我正确地设置了我的事件发射器。任何人都可以帮我解决我在这里可能出错的地方吗?
由于
答案 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/