JavaScript:调用已启动类(数据包处理程序)的变量函数

JavaScript: Calling variable functions of an initiated class (packet-handler)

本文关键字:程序 处理 函数 变量 数据包 调用 启动 JavaScript      更新时间:2023-09-26

我正在用Node.JS构建一个服务器/客户端模型,并希望通过使用变量数据包ID来调用一个已经实例化的类的函数,并通过不同的函数处理传入的服务器数据包。因此,我将数据包id作为PacketMethods对象的属性,并将要调用的函数作为每个数据包id属性的值。然而,在本例中,当调用ServerList()时,它不是启动的Client类的成员,因此this.socket是未定义的。

如何调用数据包处理函数,使它们成为Client的成员?

function Client (...)
{
  this.socket = new net.Socket();
  ...
}
Client.prototype.HandlePacket = function(blocks)
{
  try {
    var sPacket = new WRPacket(blocks);
    var PacketMethods = {
      4352 : this.ServerList
      4351 : this.LoginResponse
    }
    if(PacketMethods.hasOwnProperty(sPacket._packetid))
      PacketMethods[sPacket._packetid](sPacket);
    else
      console.log('Unhandled Packet: '+sPacket._packetid);
    } catch(err) {
      console.log("Error at Packet-Handler:'n"+err);
  }
}
Client.prototype.ServerList = function(Packet) 
{
  console.log('Serverlist received ...');
  ...
  this.socket.end();
}

谢谢!

您可以将方法bind发送到您的实例:

var PacketMethods = {
  4352 : this.ServerList.bind(this),
  4351 : this.LoginResponse.bind(this)
}

您可以简单地使用PacketMethods来存储方法的名称,然后使用正确的上下文调用它们:

var PacketMethods = {
    4352 : 'ServerList'
    4351 : 'LoginResponse'
};
if (PacketMethods.hasOwnProperty(sPacket._packetid)) {
    var method = PacketMethods[sPacket._packetid];
    this[method](sPacket);
}