Я был убежден, что следующие 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);

Почему эти 2 не одно и то же?

В этих функциях со стрелками нет 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);
  }
}
0
bvdb

1 ответ

Что касается самого класса DataReader…

Он использует этот , например this._buffer + = data;

Поэтому код, который должен вызывать processData , должен гарантировать, что myReader является для него значением this .

Функция стрелки делает это, вызывая его как myReader.processData (data) .

Если вы передаете функцию processData в качестве аргумента в , тогда код обработки событий не вызывает ее в контексте myReader . Он даже не знает, что myReader существует.

Если вы хотите удалить функцию стрелки, вам нужно сделать что-то еще, чтобы сохранить контекст myReader .

Вы можете использовать выражение функции или bind .

process.stdout.on('data', function (data) {
   myReader.processData(data);
});

process.stdout.on('data', myReader.processData.bind(myReader));
58579732