2009-08-07 5 views
16

Ich habe eine Ajax-JavaScript-Methode, die Daten von einer Seite zieht usw.Möchten Sie eine Javascript-Funktion, jede Minute laufen, aber maximal 3 mal

ich diesen Prozess auf einem Zeitintervall ausgeführt werden soll, jede Minute sagen. Aber ich will nicht, dass es für immer Schleife, also maximal 3 mal.

Was ist der beste Weg, dies zu implementieren?

+0

schnell und schmutzig, aber warum nicht einfach einen Zähler erhöhen jedes Mal, wenn die Anfrage ausgeführt wird und wenn (Zähler <3) {intervalRun();}? – Optimate

+0

@optimate: Was ist intervalRun()? – Nosredna

+0

Er meinte 'setInterval' zu sagen. – SLaks

Antwort

40

So:

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

    //... 
} 

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

+1 - das ist die bessere Lösung. Mit 'setInterval()' vermeiden Sie den ständigen Aufruf von 'setTimeout()' und das Schleifen-Timing von 'foo()' ist etwas schneller, weil Sie nicht auf 'foo()' warten müssen, um alles vorher zu verarbeiten Einrichten des nächsten Anrufs – zombat

+0

@zombat Tatsächlich wird setTimeout() in vielen Szenarien oft auf setInterval() gesetzt, hauptsächlich weil setInterval() die Funktion 60 Sekunden nach dem Start der ersten Funktion * starten wird *, nicht beendet. Gerade jetzt, da Chrome & Firefox die Hintergrundregister einschränken, ist setInterval() wesentlich zuverlässiger, wenn Sie nicht alle drei dieser Funktionsaufrufe gleichzeitig stapeln möchten. –

1

Sie setInterval() verwenden und dann innerhalb der aufgerufenen Funktion eine Zählung halten, wie oft Sie die Funktion ausgeführt haben und dann clearInterval().

Oder Sie verwenden setTimeout() und dann in dem Funktionsaufruf setTimeout() aufgerufen wieder, bis Sie es 3 mal gemacht haben.

0
var testTimeInt = 3; 
function testTime(){ 

    testTimeInt--; 

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

} 


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

Verwendung setInterval, sollten Sie einen Verweis erhalten.

var X=setInterval(....); 

Auch haben einen globalen Zähler

var c=0; 

Innerhalb der Funktion durch die setIntervale genannt tun:

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

Wiederverwendbare Ansatz

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

Verschlussbasis Lösung, unter Verwendung.210 und 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: Eine andere Möglichkeit, das gleiche auszudrücken, mit setTimeout() statt:

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

Vielleicht ist das letztere ein bisschen leichter zu verstehen.

In der setTimeout() Version können Sie sicherstellen, dass die nächste Iteration geschieht nur nach die vorherige Ausführung beendet ist. Sie würden einfach die func() Linie über die setTimeout() Linie verschieben.

+0

+1 Ich mag Ihre Schließung-basierte Lösung besser als meine Objekteigenschaft basiert eine unten. Zumindest haben wir uns beide Gedanken über die Wiederverwendbarkeit gemacht: D –

3

Diese anonyme Funktion (es werden keine neuen Globals einführen) wird tun, was Sie brauchen. Alles, was Sie tun müssen, ist yourFunction mit Ihrer Funktion zu ersetzen.

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

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

Tomalak Funktion erweitern:

Wenn Sie, wie viele Zyklen wissen wollen, sind links:

var repeater = function(func, times, interval) { 
    window.setTimeout(function(times) { 
    return function() { 
     if (--times > 0) window.setTimeout(arguments.callee, interval); 
     func(times); 
    } 
    }(times), interval); 
} 

und Verwendung:

repeater(function(left){ 
    //... (do you stuff here) ... 
    if(left == 0) { 
     alert("I'm done"); 
    } 
}, 3, 60000); 
4

Sie mit setInterval tun können

var count = 0; 

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

function yourFunction(){ 

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

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

// your code 


} 
+0

Bitte bearbeiten Sie Ihre Antwort und formatieren Sie den Code, um ihn lesbar zu machen. – kleopatra

Verwandte Themen