자바스크립트 함수를 매 분마다 실행하고 최대 3번 실행하기를 원합니다.
나는 페이지 등에서 데이터를 추출하는 아약스 자바스크립트 방식을 가지고 있습니다.
이 프로세스가 매 분마다 시간 간격을 두고 실행되기를 원합니다.하지만 나는 그것이 영원히 반복되는 것을 원하지 않기 때문에, 최대 3번까지.
이를 구현하는 가장 좋은 방법은 무엇입니까?
다음과 같이:
var runCount = 0;
function timerMethod() {
runCount++;
if(runCount > 3) clearInterval(timerId);
//...
}
var timerId = setInterval(timerMethod, 60000); //60,000 milliseconds
폐쇄 기반 솔루션, 사용setInterval()그리고.clearInterval():
// define a generic repeater
var repeater = function(func, times, interval) {
var ID = window.setInterval( function(times) {
return function() {
if (--times <= 0) window.clearInterval(ID);
func();
}
}(times), interval);
};
// call the repeater with a function as the argument
repeater(function() {
alert("stuff happens!");
}, 3, 60000);
EDIT: 동일한 것을 표현하는 또 다른 방법, 사용setTimeout()대신:
var repeater = function(func, times, interval) {
window.setTimeout( function(times) {
return function() {
if (--times > 0) window.setTimeout(arguments.callee, interval);
func();
}
}(times), interval);
};
repeater(function() {
alert("stuff happens!");
}, 3, 2000);
아마도 후자가 조금 더 이해하기 쉬울 것입니다.
에서setTimeout()이전 버전의 실행이 완료된 후에만 다음 반복이 발생하도록 할 수 있습니다.당신은 간단히 이동할 것입니다.func()의 위에 선setTimeout()선.
재사용 가능한 접근법
function setMaxExeuctionInterval( callback, delay, maxExecutions )
{
var intervalCallback = function()
{
var self = intervalCallback;
if ( 'undefined' == typeof self.executedIntervals )
{
self.executedIntervals = 1;
}
if ( self.executedIntervals == maxExecutions )
{
clearInterval( self.interval )
}
self.executedIntervals += 1;
callback();
};
intervalCallback.interval = setInterval( intervalCallback, delay );
}
// console.log requires Firebug
setMaxExeuctionInterval( function(){ console.log( 'hi' );}, 700, 3 );
setMaxExeuctionInterval( function(){ console.log( 'bye' );}, 200, 8 );
이 익명 기능(새로운 글로벌을 소개하지 않음)은 필요한 것을 수행합니다.당신이 해야 할 일은 교체하는 것입니다.yourFunction당신의 기능으로.
(function(fn, interval, maxIterations) {
var iterations = 0,
id = setInterval(function() {
if (++iterations > maxIterations)
return clearInterval(id);
fn();
}, interval);
})(yourFunction, 60000, 3);
setInterval로 할 수 있습니다.
var count = 0;
var interval = setInterval(yourFunction(), 1000);
function yourFunction (){
clearInterval(interval);
if(count < 3){
count ++;
interval = setInterval(yourFunction(), 1000);
}
// your code
}
Tomalak 기능 확장하기
남은 사이클 수를 알고 싶은 경우:
var repeater = function(func, times, interval) {
window.setTimeout( function(times) {
return function() {
if (--times > 0) window.setTimeout(arguments.callee, interval);
func(times);
}
}(times), interval);
}
및 사용:
repeater(function(left){
//... (do you stuff here) ...
if(left == 0) {
alert("I'm done");
}
}, 3, 60000);
setInterval을 사용합니다. 참조를 얻어야 합니다.
var X=setInterval(....);
또한, 글로벌 카운터를 가지고 있습니다.
var c=0;
SetIntervale에 의해 호출되는 함수 내에서 다음을 수행합니다.
c++;
if(c>3) window.clearInterval(X);
setInterval()을 사용한 다음 호출된 함수 내부에서 함수를 실행한 횟수를 카운트한 후 삭제할 수 있습니다.간격().
또는 setTimeout()을 사용한 다음 호출된 함수 setTimeout()을 다시 호출하여 세 번 수행할 수 있습니다.
var testTimeInt = 3;
function testTime(){
testTimeInt--;
if(testTimeInt>0)
setTimeOut("testTime()", 1000);
}
setTimeOut("testTime()", 1000);
언급URL : https://stackoverflow.com/questions/1245617/want-a-javascript-function-to-run-every-minute-but-max-3-times
'programing' 카테고리의 다른 글
| WebAPI 파일 업로드 - 디스크에 파일을 쓰지 않음 (0) | 2023.08.27 |
|---|---|
| 단일 레코드만 가져오는 경우에도 Oracle을 통해 예상되는 대량의 I/O (0) | 2023.08.22 |
| 하위 디렉터리를 나열하지 않고 폴더의 전원 차단 폴더 크기 (0) | 2023.08.22 |
| 매트 탭 그룹을 사용하여 Angular 2 재료에서 매트 탭을 프로그래밍 방식으로 선택합니다. (0) | 2023.08.22 |
| 현재 웹 페이지 스크롤 위치를 가져오고 설정하는 방법은 무엇입니까? (0) | 2023.08.22 |