2016-04-10 2 views
0

Как ссылаться на структуру данных объекта в определении вложенного метода?

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

Я могу подтвердить, что данные содержит корректную информацию из текстового файла, и что раскол правильно tokenizing файл. Однако, похоже, у меня проблема, связанная с попыткой ссылаться на этот.list внутри обратного вызова из readFile().

Как сослаться на список? Должен ли я передать его на обратный вызов?

+0

положить 'вар самостоятельно = this' во внешней функции и относятся к' self' вместо 'this' внутри обратного вызова. – Alnitak

ответ

1

У вас есть проблема, потому что ваша функция обратного вызова создать новую область, поэтому this в функции обратного вызова не содержит ссылку на this.list.

Первый подход

Вы можете сохранить свой контекст, в переменной, а затем использовать эту переменную в функции обратного вызова.

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

Второй подход: ES6 на помощь

Новая функция от ES6 является стрелки. В отличие от функций, стрелки доляэто же как их окружающий код.

Итак, ваш код становится:

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
this.list = data.toString().split("\n"); 

«это» в строке выше делает ссылку на контекст обратного вызова ReadFile, НЕ FormHistory() контекста. Вы должны иметь ссылку где-то или связать обратный вызов.

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"); 
    }); 
    } 
} 
Смежные вопросы