Wenn Sie wirklich wollen, um den Haupt-Thread insgesamt zu blockieren und halten Sie die Ereignis-Schleife aus der Ereignis-Warteschlange zu ziehen, hier ist ein schöner Weg, um das zu tun, ohne die Erstellung von Funktionen, neue Date-Objekte oder undichte alle Variablen. Ich weiß, dass es bereits eine Million Antworten auf diese dumme Frage gibt, aber ich habe niemanden gesehen, der genau diese Lösung verwendet. Dies ist nur für moderne Browser.
Warnung : Dies ist nichts, was Sie jemals in der Produktion einsetzen würden. Es ist nur hilfreich für das Verständnis der Browser-Ereignisschleife. Sie ist wahrscheinlich nicht einmal für Tests nützlich. Es ist nicht wie eine normale System-Schlaf-Funktion, weil die JavaScript-Laufzeit ist immer noch die Arbeit jeden Zyklus.
for (let e = performance.now() + 2000; performance.now() < e; ) {}
Hier wird der setTimeout-Callback erst mindestens zwei Sekunden später aufgerufen, obwohl er fast sofort in die Ereigniswarteschlange eintritt:
setTimeout(function() {
console.log("timeout finished");
}, 0);
for (let e = performance.now() + 2000; performance.now() < e; ) {}
console.log("haha wait for me first");
Sie werden eine Pause von etwa zwei Sekunden erleben und dann sehen:
haha wait for me first
timeout finished
Der Vorteil der Verwendung von performance.now() gegenüber Date.now() ist, dass das Date-Objekt
unterliegt sowohl dem Taktversatz als auch der Anpassung des Systemtakts. Der Wert der Zeit ist nicht immer monoton steigend und die nachfolgenden Werte können entweder sinken oder gleich bleiben. *
Im Allgemeinen ist performance.now() besser geeignet, um Zeitunterschiede mit hoher Genauigkeit zu messen.
Mit einer for
Schleife hat den Vorteil, dass Sie vor der Ausführung lokale Variablen für den Block setzen können. Dadurch können Sie die Additionsberechnungen außerhalb der Schleife durchführen und sind trotzdem ein "Einzeiler". Dies sollte hoffentlich die CPU-Belastung durch diesen heißen Zyklus minimieren.