为什么不能消除此箭头功能?

问题描述 投票:0回答:1

我坚信以下2条陈述可以归结为同一件事。但是在将第一条语句重构为第二条之后,我中断了应用程序。

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);
  }
}
javascript typescript arrow-functions
1个回答
2
投票

关于DataReader类本身…

确实使用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));
© www.soinside.com 2019 - 2024. All rights reserved.