2009-08-07 132 views
16

我有JavaScript方法,從一個頁面等想要一個javascript函數爲每分鐘運行,但最多3次

我想這個過程就定時間隔運行拉數據的AJAX,說每一分鐘。 但我不希望它永遠循環,所以最多3次。

實現此目的的最佳方法是什麼?

+0

快速和骯髒,但爲什麼不只是每次請求運行時有一個計數器增量,如果(計數器<3){intervalRun();}? – Optimate 2009-08-07 16:05:22

+0

@optimate:什麼是intervalRun()? – Nosredna 2009-08-07 16:07:01

+0

他打算說'setInterval'。 – SLaks 2009-08-07 16:29:21

回答

40

像這樣:

var runCount = 0;  
function timerMethod() { 
    runCount++; 
    if(runCount > 3) clearInterval(timerId); 

    //... 
} 

var timerId = setInterval(timerMethod, 60000); //60,000 milliseconds 
+3

+1 - 這是更好的解決方案。使用'setInterval()'可以避免反覆連續調用'setTimeout()',並且'foo()'的循環時序稍微快一點,因爲您不必等待'foo()'處理所有內容設置下一個電話。 – zombat 2009-08-07 16:29:38

+0

@zombat實際上,在setInterval()的很多場景中,setTimeout()往往是首選,因爲setInterval()會在第一個函數*開始運行*之後60秒後調用該函數,還未完成。特別是現在Chrome和Firefox正在限制背景選項卡,如果您不想一次堆疊這三個函數調用,那麼setInterval()會更加可靠。 – 2017-04-17 22:53:52

1

你可以使用setInterval(),然後在被調用的函數中保存你已經運行了多少次函數然後clearInterval()。

或者你可以使用setTimeout(),然後在被調用的函數中再次調用setTimeout(),直到你做了3次。

0
var testTimeInt = 3; 
function testTime(){ 

    testTimeInt--; 

    if(testTimeInt>0) 
     setTimeOut("testTime()", 1000); 

} 


setTimeOut("testTime()", 1000); 
2

使用setInterval的,一定要得到一個參考。

var X=setInterval(....); 

而且,有一個全球性的反

var c=0; 

由setIntervale調用的函數裏面做:

c++; 
if(c>3) window.clearInterval(X); 
4

可重複使用的方法

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); 
12

基於閉合解決方案,使用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); 

編輯:表達相同,使用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()行。

+0

+1我喜歡你的基於閉包的解決方案,比我的對象屬性更好。至少我們都在考慮可重用性:D – 2009-08-07 16:47:11

3

這個匿名函數(它不會引入任何新的全局變量)會做你所需要的。你所要做的就是用你的功能替換yourFunction

(function(fn, interval, maxIterations) { 
    var iterations = 0, 
    id = setInterval(function() { 
     if (++iterations > maxIterations) 
      return clearInterval(id); 

     fn(); 
    }, interval); 
})(yourFunction, 60000, 3); 
3

延長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); 
4

,你可以在使用setInterval

var count = 0; 

var interval = setInterval(yourFunction(), 1000); 

function yourFunction(){ 

    clearInterval(interval); 
    if(count < 3){ 

    count ++; 
    interval = setInterval(yourFunction(), 1000); 
    } 

// your code 


} 
+0

請編輯您的答案並格式化代碼以使其可讀。 – kleopatra 2012-11-27 09:52:05

相關問題