我正在为某些事件动态创建事件侦听器。在那个事件监听器中我想根据事件名称做另一个发出调用,所以我想得到事件监听器名称
我正在使用node.js eventemitter。
var events = require('events').EventEmitter;
var util = require('util');
.....
.....
for(i in events) {
transport.on(events[i],function(userId) {
eventName = events[i];
var acct = accountsList[userId];
if(acct) {
acct.emit(events[i],userId);
}
});
}
上述方法正在运行,但问题在于
acct.emit(events[i],userId);
事件[i]具有循环的最后一个值。因此,如果收到任何事件,它总是发出事件的最终循环[i]值......
答案 0 :(得分:2)
因此,您在闭包中保留event_name
的值。这是合法的,但看起来不是很整洁。
相反,你可以像这样使用EventEmitter2模块
var EventEmitter = require('eventemitter2').EventEmitter2;
var emitter = new EventEmitter();
emitter.on('ev1', function (line) {
console.log(this.event); // here's your fired event
});
emitter.emit('ev1', 'has fired');
查看文档,您可以做的远远超过原始EventEmitter
答案 1 :(得分:0)
我通过功能克服了这一点......但我想知道这种方式与否......
for(i in events) {
function test(event_name){
transport.purpleEvents.on(event_name,function(userId) {
var acct = accountsList[userId];
if(acct) {
acct.emit(event_name,userId);
}
});
}
test(events[i]);
}
答案 2 :(得分:0)
您正在使用的for循环是异步的,并使用事件中的最后一个值导致所有调用。如果用forEach替换它,它将运行同步。尝试类似这个未经测试的代码:
events.forEach(function(i) {
transport.on(events[i],function(userId) {
eventName = events[i];
var acct = accountsList[userId];
if(acct) {
acct.emit(events[i],userId);
}
});
});
答案 3 :(得分:0)
你可以使用这样的闭包,这可以是实用的解决方案。
for(i in events) {
transport.on(events[i],closureplusopn(events[i]))
}
function closureplusopn(eventName){
return function(userID){
var acct = accountsList[userId];
if(acct) {
acct.emit(eventName,userID);
}
}
}