Javascript setInterval未及时返回ID

Javascript setInterval未及时返回ID,javascript,setinterval,clearinterval,Javascript,Setinterval,Clearinterval,我使用的是Javascript,没有JQuery,有一种情况我正在尝试调试 我正在使用setInterval以1秒的间隔监视被指示移动的物理硬件。一旦硬件移动到正确的位置,我就用setInterval调用返回的ID调用clearInterval 一切按预期进行-除非。。。硬件工作不正常 当硬件不能正常工作时,我第一次尝试移动硬件会返回一个错误,这是它应该工作的方式 当我收到错误时,我想通过调用clearInterval来停止间隔 然而,我看到的是 我调用setInterval,它会立即触发我的第

我使用的是Javascript,没有JQuery,有一种情况我正在尝试调试

我正在使用setInterval以1秒的间隔监视被指示移动的物理硬件。一旦硬件移动到正确的位置,我就用setInterval调用返回的ID调用clearInterval

一切按预期进行-除非。。。硬件工作不正常

当硬件不能正常工作时,我第一次尝试移动硬件会返回一个错误,这是它应该工作的方式

当我收到错误时,我想通过调用clearInterval来停止间隔

然而,我看到的是

我调用setInterval,它会立即触发我的第一个移动硬件的请求,在本例中返回一个错误,即无法快速移动硬件

当setInterval将间隔ID存储到结果变量中时,返回错误的速度似乎更快。因此,我对clearInterval的调用失败,因为ID为零,而不是正确的ID

我已经证实了这一点。。。事实上,setInterval调用有一个明显的延迟,当它返回ID时会延迟到

我调用setInterval并期望返回一个ID setInterval调用我的函数,该函数尝试移动硬件 硬件移动失败,我的函数尝试调用clearInterval,但原始的setInterval尚未返回正确的ID clearInterval失败,因为ID为零,而不是正确的ID 我的函数继续被调用 我已经尝试过清除0到100之间的所有值,正如其他帖子中所建议的那样——但这似乎并没有停止计时器——我得到的ID几乎总是2,所以我不清楚为什么它不会清除它

建议采用什么方法来确保我及时获得身份证

注意。。。由于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尚未设置),所有这些都可以完美地工作

编辑:我修改了代码,将初始drawIntervalID设置为NULL而不是零,并且正在检查NULL。在操作上没有差异。

您似乎过度管理并错误初始化了代码中的计时器ID。而且,因为你有一个计时器问题,这将是一个合乎逻辑的开始

只需将计时器变量初始化为null而不是0或任何其他整数,并直接调用clearInterval,而不是在需要时将控制传递给clearTimer函数。没有必要使用clearTimer函数,因为它没有提供任何对您实际有用的功能——只是更多的代码使事情变得复杂


似乎您可能是在使用代码之前优化代码的受害者。

代码在哪里?不可能。setInterval立即返回ID。在返回之前,它不能执行任何其他操作。显示一些代码。@MattBurland setInterval在计算setInterval时,如果应用程序遇到未处理的异常,则不会立即返回任何内容。我怀疑OP正在调用他的回调,而不是引用它。@ScottMarcus:好的,当然。“如果东西坏了,它就坏了。”@MattBurland好吧,OP就是这么说的——一个没有返回值的即时错误。所以不,不是不可能。我已经在我原来的帖子中添加了代码。我和你在第二个例子中的方法是一样的,而clearTimer是不必要的。这当然不是OP问题的原因。此外,您可以只清除任何值上的间隔,如果计时器不存在或未运行,则不会导致错误。因此,一个简单的clearIntervaldrawIntervalID应该可以工作,即使drawIntervalID为0或Null,但您没有抓住要点。客户端可以返回0作为计时器的值,OP假设0表示没有计时器。为什么要包含这些额外的代码,而这些代码在没有任何好处的情况下可能会导致问题?