2016-07-25 11 views
0

window.setInterval()メソッドに問題があります。以下は、構造の例ですが、メソッド "repeat"は繰り返し呼び出されますが、 "repeat"内のメソッドを呼び出すことはできません。この例では、マネージャ(m = new manager())をインスタンス化すると、 "Before Print"が印刷されますが、printStuffメソッドまたは "After Print"メッセージからログは出力されません。typescript window.setInterval()が正しく動作しない

これはなぜ起こっているのですか?私の実際のコードは "repeat"関数で多くの関数を呼び出す必要がありますが、別の関数への呼び出しを検出すると実行を停止します。

class manager{ 

constructor(){ 
    window.setInterval(this.repeat, 5000); 
} 

repeat(){ 
    console.log("Before Print"); 
    this.printStuff(); 
    console.log("After Print"); 
} 

printStuff(){ 
    console.log("Print Stuff"); 
} 
+0

てみてくださいを用いた方法に必要なコンテキストの外にthis.repeatを取る取るセット'setInterval(this.repeat.bind(this)、5000)' - コンソールでエラーメッセージをチェックしましたか?私は 'printStuff'が未定義であることを期待しています。なぜなら、' this'はあなたの考え方ではないからです... – nnnnnn

+0

この質問は100回尋ねられました。より強く検索してください。あなたは「これ」がどのように働くかを読んでしまうことができます。 –

+0

http://stackoverflow.com/questions/37802436/why-does-method-on-object-loose-correct-this-binding-in-settimeoutも参照してください。 –

答えて

5

間隔はあなたが明示的に 'バインド'

setInterval(this.repeat.bind(this), 5000)

または

setInterval(()=>this.repeat(), 5000)

+0

'setInterval'はコンテキストから何も取り出しません。あなたは 'this.repeat'と言ってすぐにコンテキストが失われます。 –

+0

時間がtrueではない、すべて関数の実行コンテキストを再割り当てする明示的に関数をバインドしない限り、これは同じ意味ではありません。 –

+0

あなたのコメントを解析できません。何も「再割り当て」されていません。 'this.repeat'の値には、開始するコンテキストがありません。 –

関連する問題