2016-05-11 13 views
0

私はBotのプロトタイプクラスを作成しました。私の問題は、作成した後、init()と呼ぶことです。アラートでこの値「5000」を正しく返します。しかし、そのプロトタイプ関数がgetUpdates()を呼び出すと、もはやこの値に到達せず、 "b undefined"を与えます。私もthis.Self = thisを試しました。コンストラクタではなく運はありません。setIntervalでプロトタイプ関数を呼び出す際の問題

私は苦労して、setIntervalのself.getUpdates呼び出しに()を追加すると、値が正しく取得され、別の問題が発生したことが判明しました。setIntervalは1回だけループします。私はsetTimeoutを作ってgetUpdatesの中で自分自身を呼び出そうとしましたが、 "再帰スクリプトが多すぎます:30:1"です。 I時々 "キャッチされない例外:メモリのうち、" 持っている私はもともと "VaRのprivateVars < - > this.methods" を使用していた

をずっと問題なくしかし "this.publicVars < - > Class.prototype.methods" に切り替え私は彼らがより速く、より少ないメモリであるはずだと読んだので、しかしこのプロトタイプの方法は私に問題を与えてくれました。私はGoogleをブラウズしようとしましたが、運はありませんでした。私はinit()でタイマーを開始することを好むでしょう。

var Bot = function() { 
    "use strict"; 
    this.updateInterval = 5000; 
    this.updateTimer = null; 
}; 
Bot.prototype.getUpdates = function() { 
    "use strict"; 
    var self = this; 
    alert("b " + self.updateInterval); // returns "b undefined" 
}; 
Bot.prototype.init = function() { 
    "use strict"; 
    var self = this; 
    $.get(/* pretend url is here*/, function (data, status) { 
     alert("a " + self.updateInterval); // returns "a 5000" 
     self.updateTimer = setInterval(self.getUpdates, self.updateInterval); 
    }); 
}; 
window.bot = new Bot(); 
window.bot.init(); 

すべてのヘルプやアドバイスをいただければ幸いです。

は、ここに私のコードです。しかし、私はプロトタイプがタイマーを含んでいれば行く方法ではないと思っています。

答えて

1

あなたが明示的にコンテキストを結合しない場合は、getUpdatesの内部thisコンテキストは、ウィンドウを指します

self.updateTimer = setInterval(self.getUpdates.bind(self), self.updateInterval); 

、関数のリファレンスに適切thisコンテキストをbindする必要があります。従ってwindow.updateIntervalundefinedになります。

0

あなたgetUpdates機能でthisコンテキストを設定するbindを使用することができます。

self.updateTimer = setInterval(self.getUpdates.bind(self), self.updateInterval); 

Working example

0

あなたはgetUpdates関数にボットのthis参照を送信することができます。

Bot.prototype.getUpdates = function (self) { 
    "use strict"; 
    alert("b " + self.updateInterval); 
}; 
Bot.prototype.init = function() { 
    "use strict"; 
    var self = this; 
    $.get(/* pretend url is here*/, function (data, status) { 
     alert("a " + self.updateInterval); 
     self.updateTimer = setInterval(self.getUpdates(self), self.updateInterval); 
    }); 
}; 
+0

両方@Rajaprabhu Aravindasamyと@Razzi Abuissa答えは、問題を解決する助け、応答が非常に速く感謝を期待していませんでした。しかし、@ Raminの回答はうまくいかなかった、setIntervalは一度だけ私のために起動したが、試してくれてありがとう。クラスのプロトタイプメソッドにアクセスする他の方法はありますか?この値は、 'window'を前提にしていないset rootのようですか?複数の関数が呼び出されているとしますが、 'this'はそれを参照しているかどうかを知っていますか? – Nova

+0

これは正しい@Novaですが、RajaprabhuとRazziがどのように提案しているので、他のすべての関数にBot関数リファレンスを送信するオーバーヘッドはありません。彼らのために親切。しかし、あなたの場合、どこからでもBot関数リファレンスにアクセスしたい場合は、Bot関数内のこの 'window.botReference = this;'のようにウィンドウオブジェクト内の変数にその参照を割り当てることができます。 – Ramin

関連する問題