मुझे विश्वास हो गया था कि निम्नलिखित 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 27 अक्टूबर 2019, 16:13

1 उत्तर

सबसे बढ़िया उत्तर

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));
2
Quentin 27 अक्टूबर 2019, 13:25