在node.js中,如何告知发出事件的来源?

时间:2014-04-05 20:44:02

标签: javascript node.js

有没有办法告诉事件处理程序内部回调哪个函数和/或对象发出(调用)事件?

以下是一个示例程序:

var EventEmitter, ee, rand, obj;
EventEmitter = require("events").EventEmitter;

ee = new EventEmitter();
ee.on('do it', cFunc);

obj = {
    maybeMe:    true,
    emitting:   function() {
                    ee.emit('do it');
                }
}
function aFunc() {
    ee.emit('do it');
}
function bFunc() {
    ee.emit('do it');
}
function cFunc() {
    console.log('Who called me to do it?  aFunc or bFunc or obj (obj.emitting)?');
}

rand = Math.random(); 

if (rand < .3) {
    aFunc();
} else if (rand < .6) {
    bFunc();
} else {
    obj.emitting();
}

另外,如果发出的事件的源来自内置模块中的node.js,则另一种用途。例如,&#39;错误&#39;事件。如果我使用公共回调进行错误处理,那么这个回调能否知道是谁发出了调用它的事件?

2 个答案:

答案 0 :(得分:3)

这是您特定示例的解决方案:

function cFunc() {
    var caller = new Error().stack.split("\n")[3].trim().substring(3).split(" (")[0];
    console.log('Who called me to do it?  aFunc or bFunc or obj (obj.emitting)?');
    console.log(caller);
}

解释

我们使用Error来获取当前堆栈(more info)。堆栈表示为字符串 - 第四行表示调用函数。

答案 1 :(得分:1)

是的,事件监听器函数中的this将引用发出事件的EventEmitter对象。一般来说,使用this可能不是一个好主意,因为它可能不代表您感兴趣的完整对象。相反,您可以通过闭包引用原始对象,如下所示:

object.on('event', function() {
  var value = object.value;
});