我正在设计Node中的通信服务器,处理传入的消息(由client1发送)并将它们传输给其他人(client2),他们回复消息并通过服务器将答案发送回client1。 通过WebSockets进行通信,这意味着从每个客户端到服务器的开放连接。
因此我实现了一个ConnectionManager,当新客户端上线时,我可以注册任何新连接。为每个连接分配一个messageQueue,其中所有传入的消息在处理之前都被缓存。
在处理结束时,我有一个ServerTaskManager,它为服务器生成输出任务,告诉他要发送的消息和接收它的接收者。
此ServerTaskManager在注册服务器侦听的新serverTask时发出Node-Event(继承自EventEmitter)。
现在我希望我的ConnectionManager也能监听serverTaskManager的事件,以便让他将messageQueue中的下一条消息推送到处理中。
现在的问题是,我可以很好地捕获ConnectionManager中的ServerTaskManager事件,但是,当然,侦听器中的“this”是ServerTaskManager,而不是ConnectionManager。因此,调用属于ConnectionManager的任何“this.someFunction()”函数将不起作用。
以下是一些代码:
/**
* ServerTaskManager - Constructor
* Implements Singleton pattern.
*/
function ServerTaskManager()
{
var __instance;
ServerTaskManager = function ServerTaskManager()
{
return __instance;
}
ServerTaskManager.prototype = this;
__instance = new ServerTaskManager();
__instance.constructor = ServerTaskManager;
return __instance;
}
util.inherits(ServerTaskManager, EventEmitter);
/**
* ConnectionManager - Constructor
* Also implements Singleton pattern.
*/
function ConnectionManager()
{
var __instance;
ConnectionManager = function ConnectionManager()
{
return __instance;
}
ConnectionManager.prototype = this;
__instance = new ConnectionManager();
__instance.constructor = ConnectionManager;
__instance.currentConnections = [];
// Listen for new serverInstructions on the serverTaskManager
serverTaskManager.on('newInstruction', function(messageObject, currentReceiver)
{
this.processNextMessage(currentReceiver);
});
return __instance;
}
util.inherits(ConnectionManager, EventEmitter);
现在,当我运行此命令并且“newInstructions”事件由serverTaskManager触发时,节点抛出:
TypeError: Object #<ServerTaskManager> has no method 'processNextMessage'
这当然是真的。我想调用的函数属于ConnectionManager:
/**
* Starts processing the next message
*
* @param connectionId (int) - The ID of the connection, of which to process the next message.
*/
ConnectionManager.prototype.processNextMessage = function (connectionId)
{
// Some Code...
}
很明显,当收听ServerTaskManager事件时,侦听器中的“this”是ServerTaskManager。现在如何在侦听器中调用ConnectionManager的函数?
我希望我不会被事件和监听器和/或原型扩展如何工作(在Node中)完全误导。这个项目是迄今为止我在JavaScript中使用过的最先进的项目。通常我只用一点客户端JS编写PHP。
提前获取任何提示! WORP
答案 0 :(得分:0)
喜欢这个。
serverTaskManager.on('newInstruction', function(messageObject, currentReceiver)
{
ConnectionManager.processNextMessage(currentReceiver);
});
或者像这样。
serverTaskManager.on('newInstruction', function(messageObject, currentReceiver)
{
ConnectionManager().processNextMessage(currentReceiver);
});
PS:你的问题不必要很长。发布代码时,不一定发布您的示例。将代码简化为显示您所看到的行为的最简单形式要容易得多。你会以这种方式得到更多质量的回应。