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.

31voto

Ravinder Payal Punkte 2657

Ein Inliner:

(async () => await new Promise(resolve => setTimeout(resolve, 500)))();

500 ist die Zeit in Millisekunden, die VM wartet, bevor sie zur nächsten Codezeile übergeht.

Ein wenig tldr;

Grundsätzlich wird bei der Erstellung eines Versprechens ein Observable zurückgegeben, während bei der Erstellung ein Verweis auf resolve in einem Callback für die Übergabe von Daten/Antworten vorgesehen ist, sobald diese verfügbar sind. Hier wird resolve aufgerufen über setTimeOut nach 500ms, und bis resolve nicht ausgeführt wird, wartet der äußere Bereich darauf, weiterzumachen, wodurch eine Scheinblockierung entsteht. Es ist völlig anders als die non-blocking (oder rufen Sie nicht-Thread-Reserving-Schlaf in anderen Sprachen zur Verfügung), wie der Thread und wahrscheinlich die UI und alle anderen laufenden Aufgaben der Webpage/Node-Anwendung blockiert werden und der Haupt-Thread wird ausschließlich für die Erwartung der Versprechen Auflösung verwendet werden.

29voto

Pablo Fernandez Punkte 98441

Erstens:

Definieren Sie eine Funktion, die Sie ausführen möchten, wie folgt:

function alertWorld(){
  alert("Hello, World!");
}

Dann planen Sie seine Ausführung mit der setTimeout Methode:

setTimeout(alertWorld, 1000)

Beachten Sie zwei Dinge

  • das zweite Argument ist die Zeit in Millisekunden
  • als erstes Argument müssen Sie nur den Namen (Referenz) der Funktion ohne die Klammern übergeben

23voto

k06a Punkte 16169

Die kürzeste Lösung ohne jegliche Abhängigkeiten:

await new Promise(resolve => setTimeout(resolve, 5000));

23voto

Mainguy Punkte 1600

Eine bessere Lösung, um die Dinge so aussehen zu lassen, wie es die meisten Leute wollen, ist die Verwendung einer anonymen Funktion:

alert('start');
var a = 'foo';
// Lots of code
setTimeout(function(){  // Beginning of code that should run AFTER the timeout
    alert(a);
    // Lots more code
}, 5000);  // Put the timeout here

Das ist wahrscheinlich das, was dem am nächsten kommt, was man einfach tun kann, was man will.

Wenn Sie mehrere Schlafplätze benötigen, kann das schnell hässlich werden, und Sie müssen Ihren Entwurf möglicherweise überdenken.

20voto

nkitku Punkte 3128

Einzeiler mit Versprechen

const wait = t => new Promise(s => setTimeout(s, t, t));

Typescript mit Abbruchsignal

const wait = (x: number, signal?: AbortSignal): Promise<number> => {
  return new Promise((s, f) => {
    const id = setTimeout(s, x, x);
    signal?.addEventListener('abort', () => {
      clearTimeout(id);
      f('AbortError');
    });
  });
};

Demo

const wait = t => new Promise(s => setTimeout(s, t));
// Usage
async function demo() {
    // Count down
    let i = 6;
    while (i--) {
        await wait(1000);
        console.log(i);
    }
    // Sum of numbers 0 to 5 using by delay of 1 second
    const sum = await [...Array(6).keys()].reduce(async (a, b) => {
        a = await a;
        await wait(1000);
        const result = a + b;
        console.log(`${a} + ${b} = ${result}`);
        return result;
    }, Promise.resolve(0));
    console.log("sum", sum);
}
demo();

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