如何在node.js事件监听器中获取事件名称?

我为一些事件dynamic创build事件监听器。 在那个事件监听器,我想做另一个基于事件名称的发出调用,所以我想获得事件监听器名称

我正在使用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]具有循环的最后一个值。 所以如果收到任何事件它总是发出事件[我]值的最后一个循环…

所以你在closures中保存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

我通过function克服了这一点…但我想知道这个正确的方式或不…

  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]); } 

您正在使用的for循环是asynchronous的,并使用事件中的最后一个值导致所有调用。 如果用forEach代替它,它将运行同步。 尝试这样的未经testing的代码:

  events.forEach(function(i) { transport.on(events[i],function(userId) { eventName = events[i]; var acct = accountsList[userId]; if(acct) { acct.emit(events[i],userId); } }); }); 

你可以使用像这样的闭包,可以是实用的解决scheme。

 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); } } }