2016-04-10 8 views
0

Wie wird die Objektdatenstruktur in der geschachtelten Methodendefinition referenziert?

function FormHistory() 
 
{ 
 
    this.list = []; 
 
    this.restoreFromFile = function() 
 
    { 
 
    console.log('Restoring History From File'); 
 
    fs.readFile('FormHistory.txt', function(err, data) { 
 
     if(err) throw error; 
 
     this.list = data.toString().split("\n"); 
 
    }); 
 
    } 
 
}

ich diese Daten bestätigen hält die richtigen Informationen aus der Textdatei, und dass die Spaltung die Datei korrekt Zeichenüber. Es scheint jedoch, dass ich ein Problem habe, wenn ich versuche, innerhalb eines Callbacks von readFile() auf this.list zu verweisen.

Wie referenziere ich die Liste? Muss ich es an den Rückruf weitergeben?

+0

put 'var self = this' in der äußeren Funktion und beziehen sich auf' self' statt this' innerhalb der Callback '. – Alnitak

Antwort

1

Sie haben ein Problem, weil Ihre Callback-Funktion einen neuen Bereich erstellen, so dass die this in Ihrer Callback-Funktion nicht einen Verweis auf this.list halten.

Erster Ansatz

Sie Ihren Kontext in einer Variablen speichern und dann diese Variable in Ihrer Callback-Funktion verwenden.

function FormHistory() 
{  
//Save the parent context 
     var self = this; 
     this.list = []; 
     this.restoreFromFile = function() 
     { 
     console.log('Restoring History From File'); 
     fs.readFile('FormHistory.txt', function(err, data) { 
      if(err) throw error; 
      //use the parent context in the callback function 
      self.list = data.toString().split("\n"); 
     }); 
     } 
} 

Zweiter Ansatz: ES6 zur Rettung

Ein neues Feature von ES6 ist die Pfeile. Im Gegensatz zu Funktionen, Pfeile teilen die gleiche diese als ihre umgebenden Code.

So, Ihr Code wird:

function FormHistory() 
{ 
    this.list = []; 
    this.restoreFromFile = function() 
    { 
    console.log('Restoring History From File'); 
    fs.readFile('FormHistory.txt', (err, data) => { 
     if(err) throw error; 
     //The "this" refers to the parent context, there is no new context 
     this.list = data.toString().split("\n"); 
    }); 
    } 
} 
1

Das 'Dies' in der obigen Zeile verweist auf den Callback-Kontext readFile, NICHT den FormHistory() - Kontext. Sie müssen irgendwo einen Verweis haben oder den Rückruf binden.

function FormHistory() 
{ 
    var self = this; 
    this.list = []; 
    this.restoreFromFile = function() 
    { 
    console.log('Restoring History From File'); 
    fs.readFile('FormHistory.txt', function(err, data) { 
     if(err) throw error; 
     self.list = data.toString().split("\n"); 
    }); 
    } 
} 
Verwandte Themen