2014-03-14 237 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); 
      } 
     } 
    }