2016-04-07 10 views
-2

私は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をチェックしています。操作上の違いはありません。

+2

コードはどこにありますか? – epascarello

+0

できません。 'setInterval'は直ちにIDを返します。それまでは何もできません。いくつかのコードを表示します。 –

+0

@MattBurland 'setInterval'の評価中にアプリケーションが未処理例外を経験した場合、' setInterval'は何も返さないでしょう。私はOPがそれを参照するのではなく、彼のコールバックを呼び出すと思う。 –

答えて

0

あなたのコード内のタイマーIDを過度に管理し、間違って初期化しているようです。そして、タイマーの問題があるので、これは論理的な出発点です。

ジャストnull(ない0または任意の他の整数)にごタイマ変数を初期化し、必要なときに(むしろあなたclearTimer機能に制御を渡すよりも)直接clearInterval()を呼び出します。 clearTimer()の機能は実際には便利な機能を提供していないので機能は必要ありません。問題を複雑にしているコードだけです。

コードを作業する前にコードを最適化するのが犠牲になっているようです。

+0

元の投稿にコードを追加しました。私はあなたの2番目の例と同じように呼びます。 –

+0

'clearTimer()'は不要ですが。それは確かにOPの問題の原因ではありません。また、任意の値に対して 'clearInterval'を実行するだけで、タイマーが存在しないか、実行されていない場合でもエラーは発生しません。したがって、 'drawIntervalID'が' 0'または 'null'の場合でも、単純な' clearInterval(drawIntervalID) 'は動作するはずです –

+0

ポイントがありません。クライアントは、タイマの値として「0」を返すことができ、OPは、「0」がタイマを意味しないと仮定している。利益をもたらさない場合にこの問題を引き起こす可能性のあるこの余分なコードを含む理由 –

関連する問題