2017-05-01 4 views
2

필자가 자동으로 호출하도록 작성한 함수가 필요합니다. 나는 그것을 파싱 할 때 처음으로 자신을 호출하는 빈도를 파싱 할 수 있기를 원한다. 그런 다음 동일한 값을 내부적으로 JS setTimeout() 함수와 함께 사용하여 동일한 빈도로 반복적으로 자신을 호출합니다.setTimeout의 새로 고침 빈도를 변수로 만드는 방법은 무엇입니까?

그래서 당신은 내가 아래의 샘플에서 무엇을 볼 수 있습니다

function testFunction(refreshFrequ){ 
    setTimeout(function() { 
     console.log("frequency: "+refreshFrequ); 
     testFunction(refreshFrequ); 
    }, refreshFrequ); 
} 

// run the 1st time 
testFunction(5000); 

문제는이 그것이 이후 파싱 타임 아웃이 평가되지 않습니다 실행하는 두 번째 시간에서 작동하지 않는다는 것입니다.

주파수 : 콘솔 출력이 여기에 무슨 일이 일어나고 있는지에 대한 실마리를 제공 나는이 작업을 얻을 것 어떻게

정의를, 아무것도 지금까지 도움이 없다.

+0

에서 작동하는 방법 자바 스크립트 기능에 대해 https://www.w3schools.com/jsref/met_win_setinterval.asp 등을 그냥 크롬과 그것에 [JSFiddle] (https://jsfiddle.net/4rfq4af0/)에서이 작업을 실행 잘 작동하는 것 같습니다. 나는 5 초마다 '빈도 : 5000'을 본다. 이 환경이 어떤 환경에서 작동하지 않습니까? 또한'testFunction (2000)'이라는 또 다른 호출을 추가했습니다.이 함수는 적절한 시간에 별도로 콘솔에 쓰는 것 같습니다. –

+0

이상한 ... 나는 현재 Windows에서 Chrome을 실행 중입니다 – AdamJones

답변

3

대신 Window setInterval() Method을 시도하십시오. 자세한 내용은 this answerthis answer을 참조하십시오.

var autoInterval; 
 
var elapsed = 0; 
 

 
function myStartFunction(refreshFrequ) { 
 
    if (!autoInterval) { 
 
    autoInterval = setInterval(function() { 
 
     elapsed++; 
 
     document.getElementById("txt").innerHTML = refreshFrequ * elapsed + " elapsed."; 
 
     console.log("frequency interval: " + refreshFrequ + " x " + elapsed); 
 
    }, refreshFrequ); 
 
    } 
 
} 
 

 
function myStopFunction() { 
 
    if (autoInterval) { 
 
    clearInterval(autoInterval); 
 
    autoInterval = null; 
 
    elapsed = 0; 
 
    document.getElementById("txt").innerHTML = "Interval was reset."; 
 
    console.log("interval stopped"); 
 
    } 
 
} 
 

 
myStartFunction(5000);
<p>The setInterval() method has started automatically.</p> 
 

 
<button onclick="myStartFunction(1000)" title="Start with 1000 ms interval. Clicking this button while the event is active should not create a new interval instance.">Start</button> <button onclick="myStopFunction()" title="Click to stop and clear the interval instance.">Stop</button> 
 

 
<p id="txt">0 elapsed.</p>

편집 : 잠재적 중복 된 함수 호출에 대한 언급은 없었지만, the other answer 이벤트 임의로 실행할 수 있습니다 특히, 고려되어야한다. 중복 인스턴스가 원래 인스턴스와 겹치지 않게하기 위해 if 문을 사용했습니다. 그렇지 않으면 추가로 실행되는 각 함수가 고유 한 인스턴스가되어 막을 수없는 여러 이벤트가 추가로 발생할 수 있으므로 크레딧을 지불해야하는 곳에 크레딧을 제공해야합니다. 명성은 Tymek!

+0

Brie 예 setInterval()로 전환하면 문제가 해결되었습니다. – AdamJones

1

대신 setInterval을 사용할 수 있습니다.

var testFunction = (function() { // This will "build"/"enclose" our function 
    var handle = null; // ID of the interval 
    return function (freq) { 
     if (handle !== null) clearInterval(handle); 
     handle = setInterval(function() { 
     console.log("frequency: " + freq); 
     }, freq); 
    }; 
})(); 

간격을 다시 설정하면 다른 인스턴스 (두 개의 기능이 똑딱 거리는 소리)가 생성되지 않습니다.

당신은에서 setInterval에 대해 자세히 알아볼 수 있습니다 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

관련 문제