2017-04-10 43 views
0

在Node.js的對,我們有標準的事件發射器:的Node.js - 聽時聽衆註冊

const EE = require('events'); 

const ee = new EE(); 

ee.on('x', function(){ 

}); 

什麼,我想要做的,就是聽一聽當一個客戶端註冊的監聽器。目的是如果排放者處於特定狀態,它將在註冊時採取行動。

要清楚,在調用ee.on()時,對於特定事件'x',我想採取一些行動。

如何在不修補Node.js中的所有事件發射器的情況下執行此操作?

如果我做了以下工作,我修補了原型方法或實例方法嗎?

let on = ee.on; 

ee.on = function(){ 
    if(ee.y === true){ 
     process.next(function(){ 
     ee.emit('done'); 
     }); 
    } 
    return on.apply(ee, arguments); 
}; 

這當然是一樣的:

let on = ee.on; 

    ee.on = function(){ 
     if(this.y === true){ 
      process.next(() => { 
      this.emit('done'); 
      }); 
     } 
     return on.apply(this, arguments); 
    }; 

我認爲這會工作,但我不知道。我認爲這將隻影響這一個特定事件發射器,不是所有的事件發射器,因爲它不會改變原型...

回答

1

要複製相同的行爲,應該從所有其他實例繼承的位置創建一個新的類/原型。

編輯:

<file_my_class.js>: 
var Util = require('util'); 
const EventEmmiter = require('events'); 

// private data goes here 
... 

// public data follows 
module.exports = MyClass; 

function MyClass() { 
... 
} 

Util.inherits (MyClass, EventEmmiter); 

MyClass.prototype.mymethod = function() { 
    someobj.on('somevent',() => { 
     ... 
     if (test_condition_ok) { 
      this.emit ('myeventname'); 
     } 
    }); 
} 

<main.js>: 

var MyClass = require('./file_my_class.js'); 
var myclass_instance = new MyClass(); 

myclass_instance.mymethod(); 

myclass_instance.on('myeventname',() => { 
     // Do Something 
    }); 
+0

謝謝,您能不能告訴與代碼的例子嗎? –

+0

@AlexanderMills檢查上面的編輯。清除還是需要更多輸入? –

4

您可以偵聽newListener事件:

的EventEmitter實例將發射在偵聽器添加到其內部偵聽器數組之前,它自己的'newListener'事件。

參見EventEmitter.newListener