我有JavaScript方法,從一個頁面等想要一個javascript函數爲每分鐘運行,但最多3次
我想這個過程就定時間隔運行拉數據的AJAX,說每一分鐘。 但我不希望它永遠循環,所以最多3次。
實現此目的的最佳方法是什麼?
我有JavaScript方法,從一個頁面等想要一個javascript函數爲每分鐘運行,但最多3次
我想這個過程就定時間隔運行拉數據的AJAX,說每一分鐘。 但我不希望它永遠循環,所以最多3次。
實現此目的的最佳方法是什麼?
像這樣:
var runCount = 0;
function timerMethod() {
runCount++;
if(runCount > 3) clearInterval(timerId);
//...
}
var timerId = setInterval(timerMethod, 60000); //60,000 milliseconds
+1 - 這是更好的解決方案。使用'setInterval()'可以避免反覆連續調用'setTimeout()',並且'foo()'的循環時序稍微快一點,因爲您不必等待'foo()'處理所有內容設置下一個電話。 – zombat 2009-08-07 16:29:38
@zombat實際上,在setInterval()的很多場景中,setTimeout()往往是首選,因爲setInterval()會在第一個函數*開始運行*之後60秒後調用該函數,還未完成。特別是現在Chrome和Firefox正在限制背景選項卡,如果您不想一次堆疊這三個函數調用,那麼setInterval()會更加可靠。 – 2017-04-17 22:53:52
你可以使用setInterval(),然後在被調用的函數中保存你已經運行了多少次函數然後clearInterval()。
或者你可以使用setTimeout(),然後在被調用的函數中再次調用setTimeout(),直到你做了3次。
var testTimeInt = 3;
function testTime(){
testTimeInt--;
if(testTimeInt>0)
setTimeOut("testTime()", 1000);
}
setTimeOut("testTime()", 1000);
使用setInterval的,一定要得到一個參考。
var X=setInterval(....);
而且,有一個全球性的反
var c=0;
由setIntervale調用的函數裏面做:
c++;
if(c>3) window.clearInterval(X);
可重複使用的方法
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);
基於閉合解決方案,使用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()
行。
+1我喜歡你的基於閉包的解決方案,比我的對象屬性更好。至少我們都在考慮可重用性:D – 2009-08-07 16:47:11
這個匿名函數(它不會引入任何新的全局變量)會做你所需要的。你所要做的就是用你的功能替換yourFunction
。
(function(fn, interval, maxIterations) {
var iterations = 0,
id = setInterval(function() {
if (++iterations > maxIterations)
return clearInterval(id);
fn();
}, interval);
})(yourFunction, 60000, 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);
,你可以在使用setInterval
做var count = 0;
var interval = setInterval(yourFunction(), 1000);
function yourFunction(){
clearInterval(interval);
if(count < 3){
count ++;
interval = setInterval(yourFunction(), 1000);
}
// your code
}
請編輯您的答案並格式化代碼以使其可讀。 – kleopatra 2012-11-27 09:52:05
快速和骯髒,但爲什麼不只是每次請求運行時有一個計數器增量,如果(計數器<3){intervalRun();}? – Optimate 2009-08-07 16:05:22
@optimate:什麼是intervalRun()? – Nosredna 2009-08-07 16:07:01
他打算說'setInterval'。 – SLaks 2009-08-07 16:29:21