2016-04-10 22 views
0

İç içe geçmiş yöntem tanımında nesne veri yapısı nasıl referanslanır?

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

ben bu verileri teyit edebilir metin dosyasından doğru bilgileri tutan ve bölünmüş dosyayı doğru tokenizing olduğunu. Ancak, readFile() dosyasındaki bir geri bildirimin içinde bu listeye başvurmaya çalışmam nedeniyle bir sorunla karşılaşıyor gibi görünüyor.

Listeye nasıl başvurabilirim? Onu geri çağırmam gerekiyor mu?

+0

koymak 'var kendine = dış fonksiyonunda this' ve yerine callback'inde içindeki' this' ait self' 'bakın. – Alnitak

cevap

1

geri arama işlevini Yeni kapsam oluşturmak çünkü bir sorun var, bu nedenle geri arama işlevi thisthis.list başvuru tutmaz.

İlk yaklaşım

Bir değişkene Contextinize kaydedin ve ardından geri arama işlevi içine bu değişkeni kullanabilirsiniz.

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

İkinci yaklaşım: ES6 kurtarma

ES6 gelen yeni bir özellik oklar olduğu için. İşlevlerin aksine, okları, numaralı numaralı telefonu paylaşarak bu kodları kendi kodları olarak aynı şekilde çevirin.

Yani, kod olur:

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

'bu' ile elde edilmiş doğrultusunda readFile geri bağlamında değil FormHistory() içerik referans yapar. Bir yerde referansınız olmalı veya geri aramayı sağlamalısınız.

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