2016-06-21 2 views
0

В настоящее время у меня есть функция, которая выполняет некоторый код в методе setInterval. Это работает как ожидалось. Проблема в том, что я условно выполняю код внутри этого таймера. Если условие не выполнено, он все равно будет ждать таймаут, пока не попытается снова. Есть ли способ «пропустить» задержку и выполнять ее только при выполнении условия.skip timer в интервале JavaScript

Вы заметите, что в моей демонстрации есть длительная задержка между выводом результатов 4 и 8 пунктов (как задержка между проверками). Я бы хотел, чтобы на протяжении всей процедуры была последовательная задержка.

DEMO 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); 
+1

Конечно, просто отменить таймер и сделать новый с вашей новой задержки. –

+0

Почему downvote? –

+0

@KevinB это не сработает. Таймер выходит за рамки https://jsfiddle.net/jdec4h0x/1/. –

ответ

0

Вы не можете изменить задержку интервала. Либо вы уничтожаете, либо создаете интервал, как сказал Кевин Б, или вы используете setTimeout, который вы должны вызывать каждый раз в любом случае, а затем использовать задержку или другое в зависимости от состояния.

/* ... */ 

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

/* ... */ 

Пример here

0

Есть multjple подходы, как отмечалось другими пользователями.

Я бы использовал setTimeout. Я бы поставил это в функцию, которая находится внутри цикла. Вы можете сделать это с помощью цикла while. Затем это дает возможность разрываться при выполнении условия. вам необходимо увеличить таймер на каждом цикле.

Fiddle 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) 
}