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