我挣扎了近2个小时并且仍然没有得到它。=(为了解释我得到了以下代码。
var util = require('util');
var events = require('events').EventEmitter;
function a (){
//this is my first function
var b_obj = new b();
b_obj.on('event',function(){
console.log('Something happened!');
});
};
function b (){
//this is my second function
events.call(this);
this.emit('event');
};
util.inherits(b, events);
a();
所以我尝试做的是:我得到了一个名为" a"的函数。该函数调用另一个名为" b"的函数。此函数验证某些数据并根据验证结果发出事件。
我发现,听众工作正常,事件发生正确。但是,因为看起来事件是在函数b的上下文中发出的,并且监听器在函数a的上下文中工作。为了进一步调查,我在功能b中添加了以下行:
this.on('event', function(){
console.log('event emitted!');
});
这很有效。有谁能够帮我?我确信解决方案非常简单。 =(
答案 0 :(得分:2)
如果你的意思是在函数b()中的验证过程完成时通知函数a(),那么只需在执行验证后从b发出事件。
我使用setTimeout()作为异步示例。
var EventEmitter = require("events").EventEmitter;
var theEvent = new EventEmitter();
function a(){
console.log('preparing validation..');
theEvent.on('validationDone', function(validationResult){
console.log('validation result is ' + validationResult); // prints 'validation result is true' in the next 2 sec
});
b();
}
function b(){
setTimeout(function(){
var result = true;
theEvent.emit('validationDone', result);
}, 2000);
}
a();
答案 1 :(得分:-1)
事件处理函数始终在发出事件的对象的上下文中调用,在本例中为b
。在你的例子中,你可以简单地做
function a() {
var self = this;
...
}
要记住a
的上下文,但我假设您的实际代码不同,并且您可能没有将事件处理程序指定为闭包,因此您可以在设置之前将处理程序绑定到所需的对象:
function a (){
//this is my first function
var b_obj = new b();
b_obj.on('event', handlerFunction.bind(this));
}
在这种情况下,您的handlerFunction
将始终在a
的上下文中调用。 bind
方法返回绑定到您提供的对象的新函数,请参阅Mozilla's documentation。
PS。您可能希望在将来发布之前更清楚地表达您的问题并提供更好的示例。