2016-06-09 6 views
-3

Gibt es eine Möglichkeit, den Konflikt zwischen der Verzögerung und Ausführungszeit zu vermeiden, wenn die Ausführungszeit länger als die Verzögerung mit setInterval() war?Javascript setInterval() Kollision zwischen der Verzögerung und Ausführungszeit

Zum Beispiel:

setInterval(function(){ 
    // some code that takes 300 ms to be executed 
    // which it's longer than the delay 200 ms 
}, 200); 

ich schon den alternativen Weg gefunden, die setTimeout() mit Rekursion zu verwenden ist, um sicherzustellen, dass die Verzögerung sofort beginnen, nachdem die Funktion ausgeführt wird, aber meine Frage ist setInterval() über, nicht Ersetzen Sie es mit setTimeout()

+0

Intervall also nicht verwenden, gibt es keine Möglichkeit, es zu ändern. Sie wissen, dass Sie setTimeout verwenden sollten. Eine andere Option besteht darin, den Prozess/die Logik zu beenden, wenn der vorherige Code nicht abgeschlossen wurde. – epascarello

+0

Sie können die setInterval-Funktion mit Ihrer eigenen Implementierung überschreiben. Keine anderen Optionen, denke ich. – Vitalii

+0

Ich weiß, dass ich es überschreiben kann, ich wollte nur wissen, ob es eine Technik gibt, setInterval ohne Sorge um die Ausführungszeit zu verwenden .. trotzdem danke Jungs –

Antwort

1

Ich bin nicht sicher, was Ihr Anliegen ist.

Javascript ist immer single-threaded das bedeutet, dass in der Zeit der Ausführung der von setInterval aufgerufenen Funktion keine andere Funktion ausgeführt wird und keine erneute Ausführung von setInterval stattfinden kann!

Natürlich, wenn Sie in Ihrer setInterval aufgerufenen Funktion verzögerte Aufrufe verwenden, aktivieren Sie die Funktion zu beenden und erneut ausgeführt werden. Zum Schutz vor solchen Problem, das Sie eine einfache Semaphore wie verwenden:

var inProcessing = false ; 
setInterval(function(){ 
    // some code that takes 300 ms to be executed 
    // which it's longer than the delay 200 ms 
    if (!inProcessing){ 
     inProcessing = true ; 
     $http.get(...).then(function(){inProcessing = false;...}, 
          function(){inProcessing = false;...}); 
    } 
    } 
}, 200); 
-2

Ich nehme an, Sie möchten nur einen Zyklus von setInterval verschieben, wenn der Code aus einem vorherigen Lauf nicht abgeschlossen ist.

var starts = 0; 
var ends = 0; 
function myFunc() { 
    starts++; 
    //doStuff 
    ends++; 
} 

setInterval(function() { 
    if (starts === ends) { 
     myFunc(); 
    } 
}, 200); 
0

Sie können dies nicht tun setInterval verwenden, nur setTimeout. Wenn Ihr Problem der Mangel an einfacher Aufhebung der setTimeout Methode ist, können Sie die folgenden Befehle verwenden:

var timeout = setTimeout(function runMe(){ 
    // some code that takes 300 ms to be executed 

    timeout = setTimeout(runMe, 200); 
}, 200); 

// somewhere else 

clearTimeout(timeout); 
+0

das ist die einzige Möglichkeit, die ich gefunden habe, setTimeout zu verwenden, wie Sie erzählen. @SeinopSys, Danke –