如何在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); } } }
- 将全局variables传递给JavaScript中的事件callback函数?
- NodeJS中的事件在setInterval中发出,但不是没有setInterval
- Node.js EventEmitter:如何将类上下文绑定到事件侦听器,然后删除此侦听器
- node.js – Object#<Object>没有方法'on'?
- Nodejs EventEmitter – 定义侦听器函数的作用域
- node.js eventEmitter + http.request
- 不能实例化导出的自定义模块Nodejs的实例,它扩展了EventEmitter
- NodeJS EventEmitter中事件的发送者
- NodeJS EventEmitter在类中不会被调用