0

我正在 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);

现在,当我运行它并且 serverTaskManager 触发“newInstructions”事件时,节点抛出:

 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。

提前谢谢任何提示!沃普

4

1 回答 1

0

像这样。

serverTaskManager.on('newInstruction', function(messageObject, currentReceiver)
{
     ConnectionManager.processNextMessage(currentReceiver);
});

或者像这样。

serverTaskManager.on('newInstruction', function(messageObject, currentReceiver)
{
     ConnectionManager().processNextMessage(currentReceiver);
});

PS:你的问题太长了。发布代码时,不一定要发布您的示例。将您的代码简化为展示您所看到的行为的最简单的形式要容易得多。通过这种方式,您将获得更高质量的回复。

于 2013-07-23T14:02:14.567 回答