提问者:小点点

JavaScript间隔中的跳过计时器


我目前有一个在< code>setInterval方法中执行一些代码的函数。这是预期的工作。问题是我在这个定时器中有条件地执行代码。如果不满足条件,它仍然会等待超时,直到再次尝试。有没有办法“跳过”延迟,只在条件满足时执行。

您会注意到在我的演示中,输出段落结果 4 和 8 之间存在长时间的延迟(因为它在检查之间延迟)。我希望在整个过程中始终如一地拖延。

演示https://jsfiddle.net/jdec4h0x/

var intAdd = setInterval(function() {
  refIndex++

  if(refIndex >= predefinedMaxLimit) {
    refIndex = 0;
    loopedThrough = true;
  }

  // if this exists then increment refIndex and try again
  if (loopedThrough || !$(".myclass[data-mydata1='" + predefinedData2 + "'][data-mydata2='" + refIndex + "']").length) {
    counter++;

    $('p').last().after('<p>IN Cond Ref = ' + refIndex + '</p>');


    // ** js code within this tiemout **

    if (counter >= predefinedOutputP) clearInterval(intAdd);
  }
}, 500);

共2个答案

匿名用户

您无法更改间隔的延迟。要么像 Kevin B 所说的那样销毁并创建一个间隔,要么使用 setTimeout,无论如何你都必须每次调用它,然后根据条件使用延迟或其他延迟。

/* ... */

if (conditionIsMet) intAdd = setTimeout(function() {}, 1000);
else intAdd = setTimeout(function() {}, 1);

/* ... */

这里有一个例子

匿名用户

其他用户指出了多种方法。

我会使用<code>setTimeout</code>。我会把它放在一个循环中的函数中。您可以使用while循环来完成此操作。这样,当条件满足时,就有能力爆发。您需要在每个循环中增加计时器。

小提琴 https://jsfiddle.net/jdec4h0x/4/

while (progress) {
  refIndex++

  if (refIndex >= predefinedMaxLimit) {
    refIndex = 0;
    loopedThrough = true;
  }
  if (loopedThrough || !$(".myclass[data-mydata1='" + predefinedData2 + "'][data-mydata2='" + refIndex + "']").length) {
    counter++;
    myTimer = myTimer + 500;
    console.log(refIndex);

    myFunction(refIndex);

    if (counter >= predefinedOutputP) {
      $('p').last().after('<p>Cleared Interval</p>');
      progress = false;
    }
  }
}

function myFunction(ref) {
  setTimeout(function() {
    $('p').last().after('<p>IN Cond Ref = ' + ref + '</p>');
    // ** js code within this tiemout **
  }, myTimer)
}