我是新来的,我有一个小问题:如何将一个EventEmitter与另一个“合并”或“扩展”?
我在命名空间中使用了EventEmitter2,现在我将把一个现有的EvenEmitter附加到一个命名空间。
示例: dispatcher.attach("namespace",ee);
我的函数如下所示:
Dispatcher.prototype.attach = function(namespace, emitter) {
var that = this;
if (namespace && (typeof(emitter) === "object" && emitter._events)) {
//console.log("Attach EventEmitter, Namespace: '%s'", namespace);
Object.keys(emitter._events).forEach(function(event) {
var eventname = namespace + that.delimiter + event;
var listener = emitter._events[event];
// add single function
if (typeof(listener) === "function") {
var func = listener.bind(emitter);
that.on(eventname, func);
}
// add multiple functions
if (typeof(listener) === "object") {
for (var i = 0; i < listener.length; i++) {
var func = listener[i].bind(emitter);
that.on(eventname, func);
}
}
emitter.on(event, function(){
console.log(eventname, "=", event);
var parameter = [];
parameter.push(eventname);
parameter.push(arguments);
that.emit.apply(this, parameter);
});
});
console.log(that.listenerTree);
} else {
throw new Error("Wrong parameter: dispatcher.attach('namespace', emitter)");
}
让我解释一下:
问题是,当发射器(例如HTTP Server)发出一个请求、连接或其他任何东西时,来自EvenEmiter2的事件不会被激发。我是JavaScript / NodeJS的新手
目标是侦听和发出来自其他EventEmitter的事件,命名空间如下:
dispatcher.on("http.request", function(req, res){
res.end("test");
});
emit也是如此:
dispatcher.emit("idontknow.event", "Param1", "ParamN...");
谢谢!
发布于 2016-01-14 05:11:15
我找到了一个解决方案: Result: Works,但我对此并不满意。我可以避免来自"that.ignore“的语句检查吗?
Dispatcher.prototype.attach = function(namespace, emitter) {
var that = this;
this.ignore = false;
console.log("Attach; Namespace: %s", namespace);
if (namespace && typeof(namespace) === "string" && (typeof(emitter) === "object" && emitter._events)) {
Object.keys(emitter._events).forEach(function(event) {
// namespace + event
var eventname = namespace + that.delimiter + event;
// Listen for Dispatcher events, then emit "sub" event
// dispatcher.on("namespace.<event>") -> emitter.emit("<event>");
that.on(eventname, function() {
if (that.ignore === false || that.ignoreOff === true) {
that.ignore = true;
var parameter = [];
parameter = Array.prototype.slice.call(arguments);
parameter.unshift(event);
emitter.emit.apply(emitter, parameter);
that.ignore = false;
}
});
// Listen for "sub" Emitter events, then emit dispatcher
// emitter.on("<event>") -> dispatcher.emit("namespace.<event>")
emitter.on(event, function() {
if (that.ignore === false || that.ignoreOff === true) {
that.ignore = true;
var parameter = [];
parameter = Array.prototype.slice.call(arguments);
parameter.unshift(eventname);
that.emit.apply(that, parameter);
that.ignore = false;
}
});
});
} else {
// wrong parameter...
throw new Error("Wrong parameter: dispatcher.attach('namespace', ee)");
}
};
https://stackoverflow.com/questions/34755773
复制相似问题