2014-03-14 153 views
1

我为一些事件动态创建事件侦听器。在那个事件监听器我想要做另一个基于事件名称发出呼叫,所以我想获得事件监听器名称如何在node.js事件侦听器中获取事件名称?

我正在使用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

我们可以看到更多的代码?很难说没有更多的背景下发生了什么。 – rossipedia

回答

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

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

的更适合你使用的循环是异步,并导致所有使用事件中的最后一个值进行调用。如果您将其替换为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); 
     } 
    }); 
}); 
0

你可以使用这样它可以是实际的SOLN封闭..

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