Saya yakin bahwa 2 pernyataan berikut bermuara pada hal yang sama. Tetapi setelah refactoring pernyataan pertama ke yang ke-2 saya merusak aplikasi saya.

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);

Mengapa 2 hal ini tidak sama?

Tidak ada this dalam fungsi panah ini, jadi sepertinya tidak berbahaya. Adapun kelas DataReader itu sendiri:

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 27 Oktober 2019, 16:13

1 menjawab

Jawaban Terbaik

Adapun kelas DataReader itu sendiri…

Itu memang menggunakan this, mis. this._buffer += data;

Jadi kode yang perlu memanggil processData perlu memastikan bahwa myReader adalah nilai this untuknya.

Fungsi panah melakukan ini dengan menyebutnya sebagai myReader.processData(data).

Jika Anda meneruskan fungsi processData sebagai argumen ke on maka kode penanganan peristiwa tidak memanggilnya dalam konteks myReader. Ia bahkan tidak tahu bahwa myReader ada.

Jika Anda ingin menghapus fungsi panah, maka Anda harus melakukan hal lain untuk mempertahankan konteks myReader.

Anda bisa menggunakan ekspresi fungsi, atau bind.

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

process.stdout.on('data', myReader.processData.bind(myReader));
2
Quentin 27 Oktober 2019, 13:25