簡體   English   中英

如何在 node.js 事件監聽器中獲取事件名稱?

[英]How to get event name in node.js event listener?

我正在為某些事件動態創建事件偵聽器。 在那個事件偵聽器中,我想根據事件名稱進行另一個發出調用,所以我想獲取事件偵聽器名稱

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

因此,您在閉包中保留了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更多

我通過功能克服了這個......但我想知道這個正確的方式......

   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 循環是異步的,並導致所有調用都使用事件中的最后一個值。 如果你用 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);
        }
    });
});

你可以使用像這樣的封閉,這可以是實用的解決方案..

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

您可以通過上下文參數傳遞事件名稱。 在 EventEmitter3 上,.on 函數參數是 (eventName, functionName, context)。 幫助我弄清楚如何在回調函數中獲取 eventName 的是將此字符串作為上下文傳遞並使用 this 關鍵字訪問它。 希望這對遇到這個問題並且有類似問題的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM