【问题标题】:How to get event name in node.js event listener?如何在 node.js 事件监听器中获取事件名称?
【发布时间】:2014-03-14 04:49:31
【问题描述】:

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

我正在使用 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] 值的最终循环...

【问题讨论】:

  • 我们能看到更多代码吗?如果没有更多的上下文,很难说出发生了什么。

标签: javascript node.js eventemitter


【解决方案1】:

因此,您在闭包中保留了 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 做更多的事情

【讨论】:

    【解决方案2】:

    我通过功能克服了这个......但我想知道这个正确与否......

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

    【讨论】:

      【解决方案3】:

      您使用的 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);
              }
          });
      });
      

      【讨论】:

        【解决方案4】:

        你可以使用这样的闭包,它可以是实用的解决方案。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-24
          • 1970-01-01
          • 2017-11-10
          • 2018-05-16
          • 1970-01-01
          • 1970-01-01
          • 2015-07-15
          相关资源
          最近更新 更多