2016-06-21 3 views
0

나는 현재 setInterval 메서드 내에서 일부 코드를 실행하는 함수를 가지고 있습니다. 이것은 예상대로 작동합니다. 문제는이 타이머 내에서 조건부로 코드를 실행하는 것입니다. 조건이 충족되지 않으면 다시 시도 할 때까지 시간 제한을 기다립니다. 지연을 '건너 뛰고'조건이 충족 될 때만 실행하는 방법이 있습니까?자바 스크립트 간격의 타이머 건너 뛰기

내 데모에서 단락 결과 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

당신은 간격의 지연을 변경할 수 없습니다. Kevin B가 말한 것처럼 간격을 만들거나 만들거나 항상 호출해야하는 setTimeout을 사용하고 조건에 따라 지연이나 다른 것을 사용하십시오.

/* ... */ 

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

/* ... */ 

다른 사용자들에 의해 지적 multjple 방법이 있습니다 here

0

예.

나는 setTimeout을 사용할 것입니다. 나는 이것을 루프 내에있는 함수에 넣을 것이다. 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) 
}