Frage

Gibt es eine JavaScript-Methode ähnlich dem jQuery delay() oder wait() (die Ausführung eines Skripts für eine bestimmte Zeit zu verzögern)?

War es hilfreich?

Lösung

Es gibt folgende Möglichkeiten:

setTimeout(function, milliseconds);

Funktion, die die Zeit übergeben werden kann, nach der die Funktion ausgeführt werden.

. Siehe: Fenster setTimeout() Methode

Andere Tipps

Nur um hinzuzufügen, was alle anderen über setTimeout gesagt haben: Wenn Sie eine Funktion mit einem Parameter in Zukunft anrufen möchten, müssen Sie einige anonyme Funktion Anrufe einzurichten.

Sie müssen die Funktion als Argument übergeben es später genannt werden. Im Endeffekt bedeutet dies, ohne Klammern hinter dem Namen. Im Folgenden wird der Alarm sofort anrufen, und es wird angezeigt, ‚Hallo Welt‘:

var a = "world";
setTimeout(alert("Hello " + a), 2000);

Um dies zu beheben Sie entweder den Namen einer Funktion setzen können (wie Flubba getan hat), oder Sie können eine anonyme Funktion verwenden. Wenn Sie einen Parameter zu übergeben, dann müssen Sie eine anonyme Funktion verwenden.

var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";

Aber wenn Sie diesen Code ausführen, werden Sie feststellen, dass nach 2 Sekunden wird das Pop-up sagen ‚Hallo Stack-Überlauf‘. Dies ist, weil der Wert der Variablen eines in diesen zwei Sekunden geändert hat. Um es nach zwei Sekunden ‚Hallo Welt‘ zu sagen, müssen Sie den folgenden Codeausschnitt verwenden:

function callback(a){
    return function(){
        alert("Hello " + a);
    }
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";

Es dauert 2 Sekunden warten und dann Popup 'Hallo Welt'.

Nur ein wenig zu erweitern ... Sie können Code direkt im setTimeout Aufruf ausführen, sondern als @ patrick sagt, Sie normalerweise eine Callback-Funktion zuweisen, wie diese. Es ist Millisekunden

setTimeout(func, 4000);
function func() {
    alert('Do stuff here');
}

Wenn Sie wirklich eine Blockierung (synchron) delay Funktion haben wollen (für was auch immer), warum nicht etwas tun:

<script type="text/javascript">
    function delay(ms) {
        var cur_d = new Date();
        var cur_ticks = cur_d.getTime();
        var ms_passed = 0;
        while(ms_passed < ms) {
            var d = new Date();  // Possible memory leak?
            var ticks = d.getTime();
            ms_passed = ticks - cur_ticks;
            // d = null;  // Prevent memory leak?
        }
    }

    alert("2 sec delay")
    delay(2000);
    alert("done ... 500 ms delay")
    delay(500);
    alert("done");
</script>

Sie müssen verwenden SetTimeout und eine Callback-Funktion übergeben. Der Grund, warum Sie nicht schlafen in Javascript verwenden können, ist, weil Sie die gesamte Seite blockieren würde alles in der Zwischenzeit zu tun. Kein guter Plan. Verwenden Sie Javascript Veranstaltungs-Modell und glücklich bleiben. Kämpfen Sie nicht it!

Sie können auch verwenden, window.setInterval () einige laufen Code wiederholt in regelmäßigen Abständen.

Um auf den früheren Kommentare hinzufügen, ich möchte folgendes sagen:

Die setTimeout() Funktion in JavaScript Pause nicht die Ausführung des Skripts an sich, sondern lediglich teilt dem Compiler den Code irgendwann in der Zukunft auszuführen.

Es gibt keine Funktion, die tatsächlich die Ausführung in JavaScript gebaut pausieren kann. Allerdings können Sie Ihre eigene Funktion schreiben, die nicht so etwas wie eine bedingungslose Schleife, bis die Zeit mit Hilfe der Date() Funktion und das Hinzufügen des Zeitintervalls erreicht man braucht.

Wenn Sie nur eine Verzögerung testen müssen Sie diese verwenden können:

function delay(ms) {
   ms += new Date().getTime();
   while (new Date() < ms){}
}

Und dann, wenn Sie für 2 Sekunden verzögern wollen Sie tun:

delay(2000);

vielleicht nicht die besten, obwohl für die Produktion sein. Mehr dazu in den Kommentaren

warum nicht können Sie den Code hinter dem Versprechen setzen? (Eingegeben aus der Spitze von meinem Kopf)

new Promise(function(resolve, reject) {
  setTimeout(resolve, 2000);
}).then(function() {
  console.log('do whatever you wanted to hold off on');
});

Die einfache Antwort lautet:

setTimeout(
    function () {
        x = 1;
    }, 1000);

Die Funktion oben wartet auf 1 Sekunde (1000 ms) setzt dann x 1 ist. Offensichtlich ist dies ein Beispiel; Sie können alles, was Sie in der anonymen Funktion tun wollen.

Ich möchte Maurius' Erklärung (höchste upvoted response) mit den drei verschiedenen Methoden für den Aufruf setTimeout.

In meinem Code möchte ich automatisch auf Auto-Navigation, um zur vorherigen Seite nach Abschluss eines AJAX-Ereignis speichern. Die Fertigstellung des speichert Ereignisses hat eine leichte Animation in der CSS, die die Speicher erfolgreich war.

In meinem Code habe ich einen Unterschied zwischen den ersten beiden Beispielen:

setTimeout(window.history.back(), 3000);

Dies wartet nicht für die Timeout -. Die Rückseite () nein fast sofort aufgerufen wird, unabhängig davon, welche Zahl ich für die Verzögerung setzte in

Allerdings ändert dies:

setTimeout(function() {window.history.back()}, 3000);

Das ist genau das, was ich hatte gehofft.

Dies ist auf der Rückseite () Betrieb nicht spezifisch, das gleiche mit alert() geschieht. Grundsätzlich mit dem alert() in dem ersten Fall verwendet wird, wird die Verzögerungszeit nicht berücksichtigt. Als ich das Popup abtun die Animation für die CSS weiter.

So würde ich die zweite oder dritte Methode empfehlen beschreibt er, selbst wenn Sie in Funktionen eingebaut werden und nicht mit Argumenten.

Ich hatte einige Ajax-Befehle, die ich mit einer Verzögerung zwischen laufen wollte. Hier ist ein einfaches Beispiel für eine Art und Weise, das zu tun. Ich bin bereit, in Fetzen zu zerrissen, obwohl für meinen unkonventionellen Ansatz. :)

//  Show current seconds and milliseconds
//  (I know there are other ways, I was aiming for minimal code
//  and fixed width.)
function secs()
{
    var s = Date.now() + ""; s = s.substr(s.length - 5);
  return s.substr(0, 2) + "." + s.substr(2);
}

//  Log we're loading
console.log("Loading: " + secs());

//  Create a list of commands to execute
var cmds = 
[
    function() { console.log("A: " + secs()); },
    function() { console.log("B: " + secs()); },
    function() { console.log("C: " + secs()); },
    function() { console.log("D: " + secs()); },
    function() { console.log("E: " + secs()); },
  function() { console.log("done: " + secs()); }
];

//  Run each command with a second delay in between
var ms = 1000;
cmds.forEach(function(cmd, i)
{
    setTimeout(cmd, ms * i);
});

// Log we've loaded (probably logged before first command)
console.log("Loaded: " + secs());

Sie können den Code-Block kopieren und in ein Konsolenfenster einfügen und sehen so etwas wie:

Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076

Die einfachste Lösung, um Ihre Funktion aufrufen mit Verzögerung:

function executeWithDelay(anotherFunction) {
    setTimeout(anotherFunction, delayInMilliseconds);
}

Wie andere schon gesagt, setTimeout ist Ihre sicherste Wette
Aber manchmal kann man nicht trennen die Logik auf eine neue Funktion, dann können Sie verwenden Date.now () Millisekunden zu erhalten und tun, die Verzögerung selbst ....

function delay(milisecondDelay) {
   milisecondDelay += Date.now();
   while(Date.now() < milisecondDelay){}
}

alert('Ill be back in 5 sec after you click ok....');
delay(5000);
alert('im back ' +new Date());

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top