正确使用NodeJ中的事件 - 关于“这个”上下文

时间:2013-07-23 12:36:13

标签: node.js prototype this event-listener

我正在设计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

1 个答案:

答案 0 :(得分:0)

喜欢这个。

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

或者像这样。

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

PS:你的问题不必要很长。发布代码时,不一定发布您的示例。将代码简化为显示您所看到的行为的最简单形式要容易得多。你会以这种方式得到更多质量的回应。