私はJavascript(JQueryなし)を使用しており、デバッグしようとしている状況があります。Javascript setIntervalがタイムリーにIDを返さない
私は、1秒間隔でsetIntervalを使用して、移動が指示されている物理ハードウェアを監視しています。ハードウェアが正しい位置に移動すると、setInterval呼び出しから返されたIDでclearIntervalを呼び出します。
すべてが予想どおりに動作します - ハードウェアが正しく動作していない限り...
ハードウェアが正常に動作していない場合、ハードウェアを最初に移動しようとするとエラーが返されます(これが動作するはずです)。
エラーが表示されたら、clearIntervalを呼び出して間隔を停止します。
しかし、私が見ていることはこれです...
私がしたsetIntervalを呼び出す - すぐにエラーを返します(この場合は)ハードウェアを移動するための私の最初の要求をオフに発射(ハードウェアを移動することはできません)非常に迅速に。
エラーが迅速に返されているようですが、setIntervalは間隔IDを結果の変数に格納します。したがって、IDがゼロで正しいIDではないので、clearIntervalの呼び出しは失敗します。
私はこれを確認しました...実際には、setInterval呼び出しがIDとともに返されるまでにかなりの遅延があります。したがって、このような何かが起こっている:
- 私がしたsetIntervalを呼び出すと、バック
- たsetIntervalは、ハードウェアの移動が失敗し
- は、私の関数がてclearIntervalを呼び出そうとしたハードウェアに移動しようとする私の関数を呼び出しIDを期待していますが、元のsetIntervalはまだ適切なIDに戻っていない
- IDがない適切なもの
- 私の関数が呼ばれるように続けて、ゼロであるとしててclearIntervalは失敗
私は0から100の間の値を(他のポストで示唆されているように)クリアしようとしましたが、それはタイマーを止めていないようです(私が戻ってくるIDはほとんど常に2です。なぜそれがクリアされません)。
タイムリーにIDを取得する方法を教えてください。
注... JQueryを使用していません(要件のためにできません)。ちょうど純粋なjavascript。
多くの感謝!
編集:コードを追加しています...
グローバルに宣言:ここ
var drawIntervalID = 0;
は、間隔を設定します私のコードです:
drawIntervalID = setInterval(masks_animate,1000);
masks_animate機能は、単純なストレートフォワードです単に何らかの決定を下し、他の機能を呼び出す機能です。具体的には、実際にハードウェアを移動するためにmoveCarouselを呼び出しています。 moveCarouselも、何かがうまくいかない場合は間隔をクリアしようとしている機能である:
// This function will move the carousel
function moveCarousel(mask) {
var res,i,ss;
setLO("","#000000");
if (training_mode) {
alert("Attempt to move Carousel in Training Mode ignored");
} else {
res = sendRequest("MOVE:"+mask);
i = res.indexOf('OK:');
if (i >= 0) {
ss = res.slice(i);
res = ss.split(":");
if (res.length == 2) {
res[1] = res[1].replace(/(\r\n|\n|\r)/gm,"");
setLO(res[1],"#00ff00");
} else {
alert("Carousel MOVE request returned bad data ("+ss+")");
clearTimer();
masksDisplay();
}
} else {
i = res.indexOf('ERR:');
if (i >= 0) {
ss = res.slice(i);
res = ss.split(":");
if (res.length == 2) {
res[1] = res[1].replace(/(\r\n|\n|\r)/gm,"");
setLO(res[1],"#ff0000");
} else alert("Carousel MOVE request returned bad data ("+ss+")");
} else alert("Carousel MOVE request returned bad data ("+res+")");
clearTimer();
masks_moving = 0;
masksDisplay();
}
}
return false;
}
を見て事は私が探しているの小文字で「ERR:」(からのエラー条件でありますハードウェアその場合、私はclearTimer(呼び出し)のようになります。私が言ったように
// This function will clear the timer
function clearTimer() {
if (drawIntervalID != 0) {
clearInterval(drawIntervalID);
drawIntervalID = 0;
} else {
for (var i=0; i<100; i++) clearInterval(i);
drawIntervalID = 0;
}
}
- それはすべて私のdrawIntervalIDが設定されていない場合には、ハードウェアはすぐにエラーを返し状況、を除いて完璧に動作します。まだ。
EDIT:コードを変更して最初のdrawIntervalIDをNULL(ゼロではない)に設定し、NULLをチェックしています。操作上の違いはありません。
コードはどこにありますか? – epascarello
できません。 'setInterval'は直ちにIDを返します。それまでは何もできません。いくつかのコードを表示します。 –
@MattBurland 'setInterval'の評価中にアプリケーションが未処理例外を経験した場合、' setInterval'は何も返さないでしょう。私はOPがそれを参照するのではなく、彼のコールバックを呼び出すと思う。 –