Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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
Node.js 节点事件发射器-如何将类转换为类语法_Node.js_Class_Eventemitter - Fatal编程技术网

Node.js 节点事件发射器-如何将类转换为类语法

Node.js 节点事件发射器-如何将类转换为类语法,node.js,class,eventemitter,Node.js,Class,Eventemitter,我发现了一个创建事件发射器类的示例,该类接受一个流(tcp网络连接),并从从该流中提取的数据事件中发出自己的自定义事件 无论我做什么,我都不能重做它,它将使用es6类语法。我在节点文档中看到这应该是可能的。但是我的OOP背景很差,我就是不能让它工作 我相信有人能很容易地弄明白。这是原始类(用于扩展的es5样式构造函数/util模块…) 在我的天真中,我尝试了以下方法,但我只是没有这样的背景,当它不起作用时,我不会迷路。如果你不习惯的话,“这个”会变得很复杂 class MsgClient ext

我发现了一个创建事件发射器类的示例,该类接受一个流(tcp网络连接),并从从该流中提取的数据事件中发出自己的自定义事件

无论我做什么,我都不能重做它,它将使用es6类语法。我在节点文档中看到这应该是可能的。但是我的OOP背景很差,我就是不能让它工作

我相信有人能很容易地弄明白。这是原始类(用于扩展的es5样式构造函数/util模块…)

在我的天真中,我尝试了以下方法,但我只是没有这样的背景,当它不起作用时,我不会迷路。如果你不习惯的话,“这个”会变得很复杂

class MsgClient extends EventEmitter {
  constructor(stream) {
    super();
    this.stream = stream;
    this.buffer = "";
    self = this;
  }

  stream.on("data", (data) => {
    buffer += data;
    let boundary = buffer.indexOf("\n");

    while (boundary !== -1) {
      let input = buffer.substr(0, boundary);
      self.emit("message", JSON.parse(input));
      buffer = buffer.substr(boundary + 1);
      boundary = buffer.indexOf("\n");
    }
  }) 
};
如果有人能帮我,甚至给我指点写作方向,我将不胜感激

试试这个:

class MsgClient extends EventEmitter {
  constructor(stream) {
    super();
    this.stream = stream;
    this.buffer = "";

    stream.on("data", (data) => {
      buffer += data;
      let boundary = buffer.indexOf("\n");

      while (boundary !== -1) {
        let input = buffer.substr(0, boundary);
        this.emit("message", JSON.parse(input));
        buffer = buffer.substr(boundary + 1);
        boundary = buffer.indexOf("\n");
      }
    })
  }
};
试试这个:

class MsgClient extends EventEmitter {
  constructor(stream) {
    super();
    this.stream = stream;
    this.buffer = "";

    stream.on("data", (data) => {
      buffer += data;
      let boundary = buffer.indexOf("\n");

      while (boundary !== -1) {
        let input = buffer.substr(0, boundary);
        this.emit("message", JSON.parse(input));
        buffer = buffer.substr(boundary + 1);
        boundary = buffer.indexOf("\n");
      }
    })
  }
};

或者试试这个,前面的答案也应该有用,但你可能想用这种方式

class MsgClient extends EventEmitter {
  constructor(stream) {
    super();
    this.stream = stream;
    this.buffer = "";
    this.onData = this.onData.bind(this);
    stream.on("data", this.onData);
  }

  onData(data){
    buffer += data;
    let boundary = buffer.indexOf("\n");

    while (boundary !== -1) {
      let input = buffer.substr(0, boundary);
      this.emit("message", JSON.parse(input));
      buffer = buffer.substr(boundary + 1);
      boundary = buffer.indexOf("\n");
    }
  }
}

编辑:现在应该可以编译和工作了,或者试试这个,前面的答案也应该可以,但你可能想用这种方式

class MsgClient extends EventEmitter {
  constructor(stream) {
    super();
    this.stream = stream;
    this.buffer = "";
    this.onData = this.onData.bind(this);
    stream.on("data", this.onData);
  }

  onData(data){
    buffer += data;
    let boundary = buffer.indexOf("\n");

    while (boundary !== -1) {
      let input = buffer.substr(0, boundary);
      this.emit("message", JSON.parse(input));
      buffer = buffer.substr(boundary + 1);
      boundary = buffer.indexOf("\n");
    }
  }
}

编辑:它现在应该可以编译并工作了

最终工作正常:

class MsgClient extends EventEmitter {
  constructor(stream) {
    super();
    let buffer = "";

    stream.on("data", (data) => {
      buffer += data;
      let boundary = buffer.indexOf("\n");

      while (boundary !== -1) {
        let input = buffer.substr(0, boundary);
        this.emit("message", JSON.parse(input));
        buffer = buffer.substr(boundary + 1);
        boundary = buffer.indexOf("\n");
      }
    });
  }
};

我缺少的是整个“stream.on”方法都是在构造函数中声明的,所以感谢您指出这一点。这段代码现在与原来的es5类型类一样工作。

最终工作正常:

class MsgClient extends EventEmitter {
  constructor(stream) {
    super();
    let buffer = "";

    stream.on("data", (data) => {
      buffer += data;
      let boundary = buffer.indexOf("\n");

      while (boundary !== -1) {
        let input = buffer.substr(0, boundary);
        this.emit("message", JSON.parse(input));
        buffer = buffer.substr(boundary + 1);
        boundary = buffer.indexOf("\n");
      }
    });
  }
};

我缺少的是整个“stream.on”方法都是在构造函数中声明的,所以感谢您指出这一点。此代码现在可以像最初的es5类型类那样工作。

为什么
他可能希望这样做?这甚至不能编译。@lilezek是的,我犯了语法错误。我想,因为OP想使用ES6语法,并提到了面向对象编程是的,但为什么他想有一个附加函数,它只在构造函数中使用,并且通过将其绑定到
this
,内存使用量增加了?我认为这是因为OP试图将ondata listener绑定到构造函数之外。当然,我也可能是错的,OP想要保存内存。他为什么可能想要这样做?这甚至不能编译。@lilezek是的,我犯了语法错误。我想,因为OP想使用ES6语法,并提到了面向对象编程是的,但为什么他想有一个附加函数,它只在构造函数中使用,并且通过将其绑定到
this
,内存使用量增加了?我认为这是因为OP试图将ondata listener绑定到构造函数之外。当然,我也可能是错的,OP想要节省内存