3847 Stimmen

Was ist die JavaScript-Version von sleep()?

Gibt es einen besseren Weg zur Entwicklung einer sleep in JavaScript als die folgenden pausecomp Funktion ( entnommen von hier )?

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);
}

Es handelt sich nicht um ein Duplikat von Sleep in JavaScript - Verzögerung zwischen Aktionen Ich möchte eine echter Schlaf in der Mitte einer Funktion und nicht eine Verzögerung, bevor ein Teil des Codes ausgeführt wird.

8voto

Rachael Punkte 11

Dies kann mit der sleep-Methode von Java geschehen. Ich habe es in Firefox und Internet Explorer getestet und es blockiert den Computer nicht, frisst keine Ressourcen und verursacht keine endlosen Serverzugriffe. Es scheint mir eine saubere Lösung zu sein.

Zuerst müssen Sie Java auf die Seite laden und seine Methoden verfügbar machen. Um das zu tun, habe ich dies getan:

<html>
<head>

<script type="text/javascript">

  function load() {
    var appletRef = document.getElementById("app");
    window.java = appletRef.Packages.java;
  } // endfunction

</script>

<body onLoad="load()">

<embed id="app" code="java.applet.Applet" type="application/x-java-applet" MAYSCRIPT="true" width="0" height="0" />

Wenn Sie eine schmerzfreie Pause in Ihrem JavaScript-Code wünschen, müssen Sie nur noch Folgendes tun:

java.lang.Thread.sleep(xxx)

Dabei ist xxx die Zeit in Millisekunden. In meinem Fall (als Rechtfertigung) war dies Teil der Back-End-Auftragsabwicklung in einem sehr kleinen Unternehmen, und ich musste eine Rechnung drucken, die vom Server geladen werden musste. Dazu lud ich die Rechnung (als Webseite) in einen iFrame und druckte dann den iFrame.

Natürlich musste ich warten, bis die Seite vollständig geladen war, bevor ich drucken konnte, also musste der JavaScript-Code eine Pause einlegen. Ich habe dies erreicht, indem ich die Rechnungsseite (im iFrame) ein verstecktes Formularfeld auf der übergeordneten Seite mit dem onLoad-Ereignis ändern ließ. Und der Code auf der übergeordneten Seite, um die Rechnung zu drucken, sah wie folgt aus (irrelevante Teile aus Gründen der Übersichtlichkeit abgeschnitten):

var isReady = eval('document.batchForm.ready');
isReady.value = 0;

frames['rpc_frame'].location.href = url;

while (isReady.value == 0) {
  java.lang.Thread.sleep(250);
} // endwhile

window.frames['rpc_frame'].focus();
window.frames['rpc_frame'].print();

Der Benutzer drückt also auf die Schaltfläche, das Skript lädt die Rechnungsseite, wartet, prüft jede Viertelsekunde, ob die Rechnungsseite fertig geladen ist, und öffnet das Druckdialogfeld, damit der Benutzer sie an den Drucker senden kann. QED.

8voto

Tawfik Nasser Punkte 829

In der sleep-Methode können Sie jedes beliebige then-able Objekt zurückgeben. Und nicht unbedingt ein neues Versprechen.

Exemple :

const sleep = (t) =>  ({ then: (r) => setTimeout(r, t) })

const someMethod = async () => {

    console.log("hi");
    await sleep(5000)
    console.log("bye");
}

someMethod()

8voto

Andrew Dunkman Punkte 1131

So einen Schlaf kann man in JavaScript nicht machen, oder besser gesagt, man sollte ihn nicht machen. Wenn Sie eine sleep- oder while-Schleife ausführen, bleibt der Browser des Benutzers hängen, bis die Schleife beendet ist.

Verwenden Sie eine Zeitschaltuhr, wie in dem von Ihnen angegebenen Link beschrieben.

7voto

acuth Punkte 663

Ein Szenario, in dem Sie eine sleep()-Funktion anstelle von setTimeout() verwenden möchten, ist, wenn Sie eine Funktion haben, die auf einen Benutzerklick reagiert, der letztendlich zum Öffnen eines neuen Fensters, z.B. eines Popup-Fensters, führt, und Sie eine Verarbeitung eingeleitet haben, die eine kurze Zeitspanne benötigt, bevor das Popup-Fenster angezeigt wird. Das Verschieben des geöffneten Fensters in eine Schließung bedeutet, dass es normalerweise vom Browser blockiert wird.

7voto

beauburrier Punkte 1341

Für den speziellen Fall, dass Sie eine Reihe von Aufrufen, die von einer Schleife ausgeführt werden, zeitlich strecken möchten, können Sie etwas wie den folgenden Code mit prototype verwenden. Ohne prototype können Sie die Funktion delay durch setTimeout ersetzen.

function itemHandler(item)
{
    alert(item);
}

var itemSet = ['a','b','c'];

// Each call to itemHandler will execute
// 1 second apart
for(var i=0; i<itemSet.length; i++)
{
    var secondsUntilExecution = i;
    itemHandler.delay(secondsUntilExecution, item)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X