Eine Alternative zu Javascript's bösem SetInterval

Wenn Sie Javascript häufig verwenden, müssen Sie möglicherweise die Ausführung von Code innerhalb von Zeitintervallen mit Wiederholung verzögern. Hier kommt die native Funktion setInterval zum Einsatz. Obwohl setInterval in vielen Anwendungen nützlich ist, können die Mängel von setInterval unter bestimmten Umständen Ihre Anwendung in die Luft jagen.
Warum ist setInterval böse? Es ist egal, ob der Rückruf noch läuft oder nicht In einigen Fällen benötigt die Funktion möglicherweise länger als die Intervallzeit, um die Ausführung abzuschließen. Verwenden Sie setInterval, um alle 5 Sekunden einen Remoteserver abzufragen. Die Netzwerklatenz, der nicht reagierende Server und andere Variablen können dazu führen, dass die Anforderung nicht rechtzeitig abgeschlossen wird. Was passieren würde, ist, dass Sie am Ende eine Reihe von Anfragen in der Warteschlange haben, die möglicherweise nicht unbedingt in der richtigen Reihenfolge zurückkehren.
Ignoriert Fehler Wenn aus irgendeinem Grund ein Fehler in einem Teil des Codes auftritt, der von setInterval aufgerufen wird, wird dieser nicht beschädigt und der fehlerhafte Code wird weiterhin ausgeführt.
Ist das nicht flexibel? Zusätzlich zu den zuvor erwähnten Mängeln würde ich mich sehr freuen, wenn setInterval einen optionalen Parameter zum Festlegen der Anzahl der Wiederholungen anstelle einer unendlichen Wiederholung hätte.
Eine bessere Umsetzung Also habe ich meine eigene setInterval-Funktion implementiert, die die oben genannten Mängel behebt. Es unterstützt die erwarteten setInterval-Parameter mit einem zusätzlichen optionalen Parameter zur Angabe der Anzahl der durchzuführenden Wiederholungen.


function interval(func, wait, times){
    var interv = function(w, t){
        return function(){
            if(typeof t === "undefined" || t-- > 0){
                setTimeout(interv, w);
                try{
                    func.call(null);
                }
                catch(e){
                    t = 0;
                    throw e.toString();
                }
            }
        };
    }(wait, times);

    setTimeout(interv, wait);
};
The interval funct

Die Intervallfunktion verfügt über eine interne Funktion namens interv, die automatisch über setTimeout aufgerufen wird. Innerhalb von interv ist ein Abschluss , der die Wiederholungszeiten überprüft, den Rückruf aufruft und interv über setTimeout erneut aufruft. Wenn beim Rückruf eine Ausnahme auftritt, wird der Intervallaufruf gestoppt und die Ausnahme ausgelöst.
Dieses Muster garantiert natürlich nicht die Ausführung in einem festen Intervall, aber es garantiert, dass das vorherige Intervall vor dem Rekursieren abgeschlossen wurde, was meiner Meinung nach viel wichtiger ist.
Verwendungszweck Wenn Sie also fünfmal einen Code mit einem Intervall von jeweils 10 Sekunden ausführen möchten, gehen Sie wie folgt vor:


interval(function(){
        // Code block goes here
    }, 1000, 10);

Hoffe, Sie finden dieses Snippet nützlich, zögern Sie nicht, Ihre Kommentare unten zu hinterlassen.


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0