2016-03-22 10 views
3

私はXMLHttpRequest(これはWebGL用です)を介して外部リソースをロードするために使用するクラスを持っていますので、モデル、シェーダなどをロードしています。これらのリクエストをすべて実行してからそれは最終的に私はそれを作成した元の関数からコールバック関数を実行したいです。しかし、そのコールバックを実行しようとすると(ロードしたクラス内のオブジェクトにアクセスできないなど)、私は奇妙な結果を得ています。クラス内の約束の中のコールバック?

私は「この」ロードクラスにして、

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

をやって渡すことによってこの問題を回避することができますが、私はむしろ、私はそれがそのロードが行われた後にコールバックしたい関数を指定のです。これができるかどうか誰にも分かりますか?

メインクラス

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

ロードクラス

LoadingClass = function(callback, resources) { 

    .. 

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

     }); 
} 

答えて

2

あなたは

(this.LoadingComplete, resources) 

それがバインドされたオブジェクトとして関数オブジェクトを渡すと、渡されません。だから、唯一の関数オブジェクトLoadingCompleteLoadingClassに渡され、それが

callback() 

として呼び出されたときthis値がundefined(厳密モードで)であろう。ご使用の環境がES2015の矢印の機能をサポートしている場合

この問題を解決するには、

  • あなたはこの

    new LoadingClass(this.LoadingComplete.bind(this), resources) 
    
  • のように、thisオブジェクトをバインドする必要が

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

両方の場合、LoadingCompleteLoadingClassから呼び出されると、thisが保持されます。

1

あなたは当然のように(約"this"を読む)ルートオブジェクトから関数をコールバックをdetouchingされています。私のコードは次のようになりますそれは文脈を失う。 Function.prototype.bind方法で明示的にBindingContextを指定します。

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