3

我正在为某些事件动态创建事件侦听器。在那个事件侦听器中,我想根据事件名称进行另一个发出调用,所以我想获取事件侦听器名称

我正在使用 node.js 事件发射器。

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

那个 events[i] 具有循环的最后一个值。因此,如果收到任何事件,它总是会发出 events[i] 值的最终循环...

4

4 回答 4

3

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

于 2014-03-14T05:52:10.873 回答
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]);
    }
于 2014-03-14T05:20:04.823 回答
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);
        }
    });
});
于 2014-06-25T19:32:07.323 回答
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);
            }
         }
     }
于 2017-05-16T05:53:33.937 回答