尝试使用消息传递模块,该模块将提供在Node应用程序中的多个模块之间发出和侦听事件的方法。相当新的努力。我的目标是初始化一个监听器并将其直接送入回调函数。
此时快速了解语法和JS原型。
var events = require('events');
var inter_com = new events.EventEmitter();
var com_bus = {
initListener:function(listener_name, callback){
this.listener_name = listener_name;
this.callback_function = callback;
inter_com.on(this.listener_name, this.callback_function);
},
sendMessage:function(data){
inter_com.emit(this.listener_name,data);
console.log('test event sent');
}
}
var instance_of_com = Object.create(com_bus);
instance_of_com.initListeners('testing',pipeMe);
instance_of_com.sendMessage('its good to be the king');
var pipeMe = function(data){console.log(data)};`
答案 0 :(得分:1)
解决此问题的一种方法是创建一个返回com_bus实例的工厂:
function returnComBusInstance () {
// create a closure on these variables
var listener_name;
var callback_function;
return {
initListener:function(_listener_name, _callback){
listener_name = _listener_name;
callback_function = _callback;
inter_com.on(listener_name, callback_function);
},
sendMessage:function(data){
inter_com.emit(listener_name, data);
console.log('test event sent');
}
}
}
然后:
var com_bus_instance = returnComBusInstance()
我个人尽量避免使用this
,但如果您需要,可以{,1}},bind
或call
,或者您可以再次创建工厂但在apply
或者您可以将原型属性传递给this
:
Object.create
答案 1 :(得分:1)
JavaScript遵循原型继承,
1)要从一个对象继承,父必须是一个Function.Convention是该函数应该被命名为InitCap
,这表示它是一个构造函数。
2)此外,孩子继承原型,因此您需要继承Function_Name
而不是继承自Function_Name.prototype
。
var events = require('events');
var inter_com = new events.EventEmitter();
function Com_bus() {
}
Com_bus.prototype.initListeners = function(listener_name, callback) {
this.listener_name = listener_name;
this.callback_function = callback;
inter_com.on(this.listener_name, this.callback_function);
};
Com_bus.prototype.sendMessage = function(listener_name, callback) {
inter_com.emit(this.listener_name, data);
console.log('test event sent');
};
var pipeMe = function(data) {
console.log(data)
};
var instance_of_com = Object.create(Com_bus.prototype);
instance_of_com.initListeners('testing', pipeMe);
instance_of_com.sendMessage('its good to be the king');