javascript - 为什么我不能消除这个箭头功能?
问题描述
我确信以下两个陈述归结为同一件事。但是在将第一个语句重构为第二个之后,我破坏了我的应用程序。
const myReader = new DataReader(line => this.onStdOutLine(line));
process.stdout.on('data', (data) => myReader.processData(data));
const myReader = new DataReader(line => this.onStdOutLine(line));
process.stdout.on('data', myReader.processData);
为什么这两个不是一回事?
这些箭头函数中没有this
,所以它看起来是无害的。至于 DataReader 类本身:
type DataReaderCallback = (msg: string) => any
export class DataReader {
private _buffer = "";
constructor(private listener: DataReaderCallback = null) {
}
processData(data) {
// remove carriage returns.
data = data.toString().replace(/\r/g, '');
this._buffer += data;
// get only the complete data.
const lastNewlineIndex = this._buffer.lastIndexOf('\n');
if (lastNewlineIndex < 0) return;
if (this.listener != null) {
// split data in lines
const completeData = this._buffer.slice(0, lastNewlineIndex);
const lines = completeData.split('\n');
for (const line of lines) {
// notify listener line by line.
this.listener(line);
}
}
// remove processed data from the buffer.
this._buffer = this._buffer.slice(lastNewlineIndex + 1);
}
}
解决方案
至于 DataReader 类本身……</p>
它确实使用this
,例如this._buffer += data;
所以需要调用的代码processData
需要确保这myReader
是this
它的价值。
箭头函数通过调用它来做到这一点myReader.processData(data)
。
如果将processData
函数作为参数传递给,on
则事件处理代码不会在myReader
. 它甚至不知道它的myReader
存在。
如果要删除箭头功能,则必须执行其他操作来维护myReader
.
您可以使用函数表达式,或bind
.
process.stdout.on('data', function (data) {
myReader.processData(data);
});
process.stdout.on('data', myReader.processData.bind(myReader));
推荐阅读
- firebase - 在用户本地计算机上拥有 Firebase 密钥是否安全?
- html - 在 div 的每一侧放置两个箭头并使其具有响应性
- python - 当每个数据帧的大小不同时,如何匹配和绘制两个数据帧中的对应点?
- python - tkinter: self.master.destroy() 删除两个小部件
- c# - 有没有办法写入同一个文件夹中的多个文件?
- javascript - 在 javascript 优化中处理大型数据集
- r - 在数据框中包含绘图
- node.js - nodejs http模块server.listen(),如果我们不定义端口号,默认端口是什么
- c++ - 将 QPointer 存储到 QVariant 中
- android - 在旧版 android 应用程序中升级 Gradle 版本