Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:调用已启动类(数据包处理程序)的变量函数_Javascript_Node.js - Fatal编程技术网

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

JavaScript:调用已启动类(数据包处理程序)的变量函数,javascript,node.js,Javascript,Node.js,我正在使用Node.JS构建一个服务器/客户机模型,并希望通过使用可变数据包ID调用已经实例化的类的函数,并通过不同的函数处理传入的服务器数据包。因此,我将数据包id作为PacketMethods对象的属性,并将要调用的函数作为每个数据包id属性的值。但是,在本例中,当调用ServerList()时,它不是已启动的Client类的成员,因此this.socket未定义 如何调用数据包处理函数,使其成为客户端的成员 function Client (...) { this.socket = n

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

如何调用数据包处理函数,使其成为
客户端的成员

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();
}
谢谢大家!

您可以将方法添加到实例中:

var PacketMethods = {
  4352 : this.ServerList.bind(this),
  4351 : this.LoginResponse.bind(this)
}
您可以将这些方法添加到实例中:

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);
}

您只需使用
PacketMethods
存储方法的名称,然后使用正确的上下文调用它们:

var PacketMethods = {
    4352 : 'ServerList'
    4351 : 'LoginResponse'
};

if (PacketMethods.hasOwnProperty(sPacket._packetid)) {
    var method = PacketMethods[sPacket._packetid];
    this[method](sPacket);
}

这甚至更好,因为它不会在每个
HandlePacket
调用上创建很多函数。您可以将
PacketMethods
声明移到方法之外的一个静态范围中!谢谢你们两个!虽然了解bind很好,但仍然在学习JavaScript。这更好,因为它不会在每个
HandlePacket
调用上创建很多函数。您可以将
PacketMethods
声明移到方法之外的一个静态范围中!谢谢你们两个!虽然了解bind很好,但仍然在学习JavaScript。