Es gibt eine Möglichkeit, die setInterval
Methode von Javascript so zu konfigurieren , dass die Methode sofort ausgeführt und dann mit dem Timer ausgeführt wird
javascript
setinterval
Jorge
quelle
quelle
function
einmalsetInterval()
Antworten:
Es ist am einfachsten, die Funktion beim ersten Mal direkt selbst aufzurufen:
Es gibt jedoch gute Gründe, dies zu vermeiden
setInterval
- insbesondere unter bestimmten Umständen kann eine ganze Reihe vonsetInterval
Ereignissen ohne Verzögerung unmittelbar nacheinander eintreffen. Ein weiterer Grund ist, dass Sie, wenn Sie die Schleife stoppen möchten, explizit aufrufen müssen,clearInterval
was bedeutet, dass Sie sich an das vom ursprünglichensetInterval
Aufruf zurückgegebene Handle erinnern müssen .Eine alternative Methode besteht darin,
foo
sich für nachfolgende Aufrufe auszulösen, indem SiesetTimeout
stattdessen Folgendes verwenden :Dies garantiert, dass zwischen den Anrufen mindestens ein Intervall liegt
delay
. Es macht es auch einfacher, die Schleife bei Bedarf abzubrechen - Sie rufen nur nicht an,setTimeout
wenn Ihre Schleifenbeendigungsbedingung erreicht ist.Besser noch, Sie können das alles in einem sofort aufgerufenen Funktionsausdruck zusammenfassen, der die Funktion erstellt, die sich dann wie oben wieder aufruft und automatisch die Schleife startet:
Dies definiert die Funktion und startet den Zyklus auf einmal.
quelle
setTimeout
?setInterval
Ereignissen ohne Verzögerung unmittelbar nacheinander eintreffen.setTimeout
Methode verwende?Ich bin mir nicht sicher, ob ich dich richtig verstehe, aber du könntest leicht so etwas tun:
Es gibt offensichtlich eine Reihe von Möglichkeiten, dies zu tun, aber das ist die prägnanteste Art, die ich mir vorstellen kann.
quelle
arguments.callee
ist nicht im strengen ES5-Modus verfügbarIch bin aufgrund des gleichen Problems auf diese Frage gestoßen, aber keine der Antworten hilft, wenn Sie sich genau so verhalten müssen,
setInterval()
aber mit dem einzigen Unterschied, dass die Funktion sofort am Anfang aufgerufen wird.Hier ist meine Lösung für dieses Problem:
Der Vorteil dieser Lösung:
setInterval
kann einfach durch Ersetzen angepasst werdenclearInterval()
später weitergebenBeispiel:
Um frech zu sein, wenn Sie wirklich brauchen,
setInterval
dann können Sie auch das Original ersetzensetInterval
. Daher ist keine Änderung des Codes erforderlich, wenn Sie diesen vor Ihrem vorhandenen Code hinzufügen:Alle oben aufgeführten Vorteile gelten hier, es ist jedoch keine Substitution erforderlich.
quelle
setTimeout
Lösung, da sie einsetInterval
Objekt zurückgibt . Um zu vermeiden, dass Funktionen aufgerufen werden, die möglicherweise später im Code enthalten sind und daher zum aktuellen Zeitpunkt nicht definiert sind, verpacke ich den ersten Funktionsaufruf in einesetTimeout
Funktion wie diese:setTimeout(function(){ func();},0);
Die erste Funktion wird dann nach dem aktuellen Verarbeitungszyklus aufgerufen, der ebenfalls sofort erfolgt , dies aber ist mehr Fehler bewiesen.Sie können
setInterval()
eine Funktion einschließen , die dieses Verhalten bereitstellt:... dann benutze es so:
quelle
Hier ist ein Wrapper, um es hübsch zu machen, wenn Sie es brauchen:
Setzen Sie das dritte Argument von setInterval auf true und es wird unmittelbar nach dem Aufruf von setInterval zum ersten Mal ausgeführt:
Oder lassen Sie das dritte Argument weg und es behält sein ursprüngliches Verhalten bei:
Einige Browser unterstützen zusätzliche Argumente für setInterval, die dieser Wrapper nicht berücksichtigt. Ich denke, diese werden selten verwendet, aber denken Sie daran, wenn Sie sie brauchen.
quelle
Denn jemand muss das Äußere nach
this
innen bringen, als wäre es eine Pfeilfunktion.Wenn Sie der oben genannte Müll stört, können Sie stattdessen eine Schließung vornehmen.
Oder verwenden Sie den
@autobind
Dekorator je nach Code.quelle
Ich werde vorschlagen, die Funktionen in der folgenden Reihenfolge aufzurufen
Sie können das auch
_timer
an das foo weitergeben, wenn SieclearInterval(_timer)
unter einer bestimmten Bedingung möchtenquelle
Hier ist eine einfache Version für Anfänger, ohne herumzuspielen. Es deklariert nur die Funktion, ruft sie auf und startet dann das Intervall. Das ist es.
quelle
Um dieses Problem zu lösen, führe ich die Funktion ein erstes Mal aus, nachdem die Seite geladen wurde.
quelle
Es gibt ein praktisches npm-Paket namens firstInterval (vollständige Offenlegung, es ist meins).
Viele der Beispiele hier enthalten keine Parameterbehandlung, und das Ändern des Standardverhaltens
setInterval
in einem großen Projekt ist böse. Aus den Dokumenten:Dieses Muster
ist identisch mit
Wenn Sie im Browser altmodisch sind und die Abhängigkeit nicht möchten, können Sie sie einfach aus dem Code ausschneiden und einfügen.
quelle
Ok, das ist so komplex, also lassen Sie es mich einfacher sagen:
quelle
Sie können eine sehr kleine anfängliche Verzögerungszeit (z. B. 100) einstellen und diese innerhalb der Funktion auf die gewünschte Verzögerungszeit einstellen:
quelle
Es gibt ein Problem mit dem sofortigen asynchronen Aufruf Ihrer Funktion, da standardmäßig setTimeout / setInterval ein minimales Zeitlimit von einigen Millisekunden aufweist, selbst wenn Sie es direkt auf 0 setzen. Dies wird durch eine browserspezifische Arbeit verursacht.
Ein Beispiel für Code mit einer REALEN Verzögerung von Null, der in Chrome, Safari und Opera funktioniert
Weitere Informationen finden Sie hier
Und nach dem ersten Handaufruf können Sie mit Ihrer Funktion ein Intervall erstellen.
quelle
eigentlich ist das am schnellsten zu tun
Dies ruft meine Funktion auf und führt sie dann alle 45 Sekunden erneut aus, was sich von der Ausführung unterscheidet
das wird es nicht nennen, sondern nur planen
quelle
myFunction()
es sich selbst zurückgibt. StattdessensetInterval
ist es besser, jede Funktion, die von ihr aufgerufen werden soll, so zu ändern, dass siesetInterval
einmal umbrochen wird, wie es die anderen Antworten vorschlagen.