Javascript setInterval未及时返回ID
我使用的是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 非常感谢 编辑:正在添加代码 全球宣布:Javascript setInterval未及时返回ID,javascript,setinterval,clearinterval,Javascript,Setinterval,Clearinterval,我使用的是Javascript,没有JQuery,有一种情况我正在尝试调试 我正在使用setInterval以1秒的间隔监视被指示移动的物理硬件。一旦硬件移动到正确的位置,我就用setInterval调用返回的ID调用clearInterval 一切按预期进行-除非。。。硬件工作不正常 当硬件不能正常工作时,我第一次尝试移动硬件会返回一个错误,这是它应该工作的方式 当我收到错误时,我想通过调用clearInterval来停止间隔 然而,我看到的是 我调用setInterval,它会立即触发我的第
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表示没有计时器。为什么要包含这些额外的代码,而这些代码在没有任何好处的情况下可能会导致问题?