2016-03-22 18 views
3

Bir XMLHttpRequest (bu WebGL için) aracılığıyla harici kaynak yüklemek için kullandığım bir sınıfa sahibim. Bu yüzden, modelleri yüklüyorum, shader'lar yüklüyorum. Planım, tüm bu istekleri yerine getirirken bir yükleme ekranı koymaktı. Nihayet tamamlandı, onu oluşturan orijinal işlevden bir geriçağırım işlevi yürütmesini istiyorum. Ancak, bu aramayı tekrar çalıştırmaya çalıştığımda tuhaf sonuçlar alıyorum (örneğin, yüklemeyi yapan sınıf içindeki nesnelerin hiçbirine erişimi yoktur).Bir sınıf içinde bir söz içinde geri arama?

"Bu" yükleme sınıfa ve sonra

self = this; 
promise(self.callback()); 

yaparak geçirerek bu sorunu gidermek alabilirsiniz ama ben daha ziyade bunun onun yükleme yapılması sonrasında etmek callback istediğiniz işlevi belirtmek etmişti . Bunun yapılabileceğini bilen var mı? Benim kod şöyle görünür:

Ana Class

this.loadingClass = new LoadingClass(this.LoadingComplete, resources); 

Main.prototype.LoadingComplete = function() 
{ 
    // Returns undefined if i specify the callback function instead of just "this" 
    console.log(this.loadingClass.anyOfTheMembersOfThisClass); 
} 

Yükleme Sınıfı Sen geri arama detouching olan

LoadingClass = function(callback, resources) { 

    .. 

     Promise.all(resources).then(function(loadedResources) 
     { 
      .. 
      callback(); 

     }); 
} 

cevap

2

Eğer

(this.LoadingComplete, resources) 

o bağlıydı hangi nesne olarak işlev nesnesini geçtikten sonra, geçmiş edilmeyecektir. Yani, yalnızca işlev nesne LoadingCompleteLoadingClass geçirilir ve

callback() 

olarak çağrıldığında this değeri undefined (katı modda) olacaktır. ortamınızın ES2015 en Ok işlevleri destekliyorsa

Bunu düzeltmek için,

  • bu

    new LoadingClass(this.LoadingComplete.bind(this), resources) 
    
  • gibi this nesneyi bağlamak gerekir

    new LoadingClass(() => this.LoadingComplete(), resources); 
    

Bu iki durumda da, LoadingCompleteLoadingClass'dan çağrıldığında, this korunur.

1

(yaklaşık "this" okuyun) kök nesneden işlevini tabii böylece bağlamı kaybeder. Function.prototype.bind yöntemle açıkça BindingContext belirtin:

this.loadingClass = new LoadingClass(this.LoadingComplete.bind(this), resources); 
İlgili konular