Wie kann ich in Node.js (Javascript) warten? Ich muss eine Zeit lang pausieren

385

Ich entwickle ein konsolenähnliches Skript für persönliche Bedürfnisse. Ich muss in der Lage sein, längere Zeit zu pausieren, aber nach meinen Recherchen kann node.js nicht wie erforderlich anhalten. Es wird nach einiger Zeit schwierig, Benutzerinformationen zu lesen ... Ich habe dort draußen Code gesehen, aber ich glaube, sie müssen anderen Code in sich haben, damit sie funktionieren, wie zum Beispiel:

setTimeout(function() {
}, 3000);

Ich brauche jedoch alles nach dieser Codezeile, um nach Ablauf der Zeit ausgeführt zu werden.

Zum Beispiel,

//start-of-code
console.log('Welcome to My Console,');
some-wait-code-here-for-ten-seconds..........
console.log('Blah blah blah blah extra-blah');
//endcode. 

Ich habe auch Dinge wie gesehen

yield sleep(2000);

Aber node.js erkennt dies nicht.

Wie kann ich diese längere Pause erreichen?

Christopher Allen
quelle
3
Wie wäre es, wenn Sie eine dieser Personen als richtige Antwort markieren :)
Billybonks
1
@ Christopher Allen, vielleicht nicht relevant, aber macht den Job: require("child_process").execSync('php -r "sleep($argv[1]);" ' + seconds);
Haitham Sweilem
Das Node-Sleep- npm-Modul könnte den Trick machen (ich würde es jedoch nur zum Debuggen verwenden)
Julian Soro

Antworten:

211

Der beste Weg, dies zu tun, besteht darin, Ihren Code in mehrere Funktionen zu unterteilen, wie folgt:

function function1() {
    // stuff you want to happen right away
    console.log('Welcome to My Console,');
}

function function2() {
    // all the stuff you want to happen after that pause
    console.log('Blah blah blah blah extra-blah');
}

// call the first chunk of code right away
function1();

// call the rest of the code and have it execute after 3 seconds
setTimeout(function2, 3000);

Es ähnelt der Lösung von JohnnyHK , ist jedoch viel übersichtlicher und einfacher zu erweitern.

Elliot Bonneville
quelle
7
@LucasSeveryn Dann machst du etwas falsch. Dies ist ein zentrales Entwurfsmuster.
Elliot Bonneville
Und was machen Sie, wenn der Start der Funktion nicht nur eine Funktion entfernt ist, sondern 10 Dateien vom Code entfernt, der deasynchronisiert werden muss?
Cyril Duchon-Doris
10
@ CyrilDuchon-Doris Was?
AturSams
3
Verwenden Sie die Antwort von @ machineghost für eine elegante, auf Versprechen basierende Lösung, die keinen benutzerdefinierten Code erfordert und das Warten / Asynchronisieren unterstützt
Dane Macaulay,
Dies ist asynchron. Wenn Funktion1 vor 3 Sekunden beendet wird, beginnen sie sich zu überlappen. Dann können Sie nicht einmal zurückkehren und es ist fast nie verwendbar. Der einzige Weg, den ich bisher gefunden habe, wardebugger;
Cristian Traìna
427

Eine neue Antwort auf eine alte Frage. Heute ( Januar 2017, Juni 2019) ist es viel einfacher. Sie können die neue async/awaitSyntax verwenden . Zum Beispiel:

async function init() {
  console.log(1);
  await sleep(1000);
  console.log(2);
}

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}   

Für die async/awaitsofortige Verwendung ohne Installation und Plugins müssen Sie Node-v7 oder Node-v8 mit dem --harmonyFlag verwenden.

Update Juni 2019: Mit den neuesten Versionen von NodeJS können Sie es sofort verwenden. Es müssen keine Befehlszeilenargumente angegeben werden. Sogar Google Chrome unterstützt es heute.

Update Mai 2020: In Kürze können Sie die awaitSyntax auch außerhalb einer asynchronen Funktion verwenden. In der obersten Ebene wie in diesem Beispiel

await sleep(1000)
function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
} 

Der Vorschlag befindet sich in Phase 3 . Sie können es heute mit Webpack 5 (Alpha) verwenden.

Mehr Info:

Aminadav Glickshtein
quelle
5
Ich denke, Sie haben das awaitSchlüsselwort vorsleep(1000)
Ryan Jarvis
6
Dies sollte wirklich die Antwort sein, das Paket sleep node.js kann problematisch sein.
Stuart Allen
4
Beste Lösung in der Tat
Kostas Siabanis
40
let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));Für Oneliner-Freaks wie mich :)
Predrag Stojadinović
21
let sleep = require('util').promisify(setTimeout);funktioniert auf Node 7.6+ und verbessert die Lesbarkeit
BrianHVB
216

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

await new Promise(resolve => setTimeout(resolve, 5000));
k06a
quelle
14
"Der Höhepunkt der Raffinesse ist die Einfachheit." - Clare Booth Luce. Dies ist bei weitem die beste Antwort, IMO.
Arnold
3
Dies ist offensichtlich viel jünger als die anderen Antworten, aber es ist das eleganteste ab 2018, mit dem die Arbeit in einer Zeile erledigt wird, ohne dass sich dies auf den Code auswirkt.
Herick
1
Das ist ein guter. Sie müssen jedoch NodeJS 7.6.0 oder höher verwenden. Bei älteren Versionen funktioniert dies nicht.
Ryan Shillington
5
let sleep = require('util').promisify(setTimeout);ist drei Zeichen länger, aber wiederverwendbar und besser lesbar imo
BrianHVB
2
Um eine Eslint-Beschwerde zu vermeiden, rufen Sie sie resolvestattdessen an done. Dhawait new Promise(resolve => setTimeout(resolve, 5000))
Darren Cook
150

Fügen Sie den Code, den Sie nach der Verzögerung ausführen möchten, in den setTimeoutRückruf ein:

console.log('Welcome to My Console,');
setTimeout(function() {
    console.log('Blah blah blah blah extra-blah');
}, 3000);
JohnnyHK
quelle
2
Dies ist furchtbar chaotisch und im Allgemeinen eine schlechte Praxis, insbesondere wenn das OP möchte, dass der Rest des Programms nach dieser Verzögerung ausgeführt wird. Siehe meine Antwort.
Elliot Bonneville
32
@ElliotBonneville Es ist nur ein Beispiel, um das Konzept zu veranschaulichen. Natürlich können (sollten) Sie den Code in einen Funktionsaufruf einbeziehen, anstatt wie überall Inline-Code zu verwenden.
JohnnyHK
@ChristopherKemp: Es stellt sich heraus, dass Node.js eine Lösung dafür hat node-fibers. Hör zu.
Elliot Bonneville
Dies ist eine großartige Lösung, insbesondere wenn Sie keinen Code ausführen möchten, sondern nur eine "Schlaf" -Methode innerhalb einer Schleife nachahmen möchten. An diesem Beispiel ist nichts auszusetzen.
Halfstop
Dies ist perfekt, um Anfragen von Kunden zu verzögern. Ich habe diesen Ansatz verwendet, um meine
Ladespinner auf Kundenseite
145

Dies ist eine einfache Blockiertechnik:

var waitTill = new Date(new Date().getTime() + seconds * 1000);
while(waitTill > new Date()){}

Es wird blockiert, sofern in Ihrem Skript nichts anderes passiert (wie Rückrufe). Aber da dies ein Konsolenskript ist, ist es vielleicht das, was Sie brauchen!

atlex2
quelle
27
schrecklich oder nicht, es macht ein einfaches wait, es blockiert und es funktioniert für einen Testzweck. Genau das, wonach ich gesucht habe.
Clijsters
8
Beantwortet die Frage perfekt ohne Bibliotheken von Drittanbietern und ist einfach. Dennoch sagen die Leute "schrecklich" .... Dies ist großartig, z. B. um eine hohe CPU-Auslastung usw. zu simulieren. Übrigens
Don Cheadle
2
Dies ist auch der erforderliche Ansatz, wenn Sie versuchen, etwas zu simulieren, das die Ereignisschleife verlangsamt und somit auch andere Benutzer / Verbindungen verlangsamt. Das Hinzufügen von verzögerten Rückrufen wirkt sich nicht auf andere Benutzer / Verbindungen aus.
Don Cheadle
13
Dies ist ein spin-wait.
Mike Atlas
7
@Ali das scheint das Ziel zu sein.
Félix Gagnon-Grenier
63

Auf Knoten 7.6.0 oder höher

Der Knoten unterstützt das native Warten:

const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));

Wenn Sie dann asynchrone Funktionen verwenden können:

await sleep(10000); // sleep for 10 seconds

oder:

sleep(10000).then(() => {
  // This will execute 10 seconds from now
});

Auf älteren Node-Versionen (ursprüngliche Antwort)

Ich wollte einen asynchronen Ruhezustand, der unter Windows und Linux funktioniert, ohne meine CPU mit einer langen while-Schleife zu belasten. Ich habe das Schlafpaket ausprobiert, es wurde jedoch nicht auf meiner Windows-Box installiert. Am Ende habe ich verwendet:

https://www.npmjs.com/package/system-sleep

Geben Sie zum Installieren Folgendes ein:

npm install system-sleep

In Ihrem Code

var sleep = require('system-sleep');
sleep(10*1000); // sleep for 10 seconds

Klappt wunderbar.

Ryan Shillington
quelle
1
tolle Antwort danke - es hat einen unmöglichen Code möglich gemacht - dies ist KEIN Spin-Wait
danday74
1
Bei weiteren Untersuchungen stützt sich dieses Modul auf Deasync, das aus einem anderen Deasync-Github-Repo stammt. Das Original-Repo warnt davor, es zu verwenden, da es sich um einen Hack handelt. Es funktioniert zwar, aber nicht auf allen Plattformen. Wenn Sie also eine plattformübergreifende Lösung benötigen, vermeiden Sie diese.
danday74
1
Ja, ich habe noch nie Probleme damit erlebt und es ist großartig für Entwickler - unter der Haube glaube ich, dass es auf C oder C ++ basiert, das weit verbreitet ist, aber ich denke, auf einigen Maschinen ist es nicht und das ist, wenn es ausfällt, weshalb es Probleme verursacht - Wenn es fehlschlägt, fällt der Systemschlaf auf eine Wartezeit zurück, die die Codeausführung einfriert
danday74
1
Dieses Paket funktioniert nicht unter Mac OS und ist daher nicht kreuzkompatibel und daher nicht funktionsfähig. Siehe github.com/jochemstoel/nodejs-system-sleep/issues/4
nuzzolilo
1
@Nuzzolilo Das ist komisch. Wir haben einen Entwickler unter Mac OS und er hat nie etwas Falsches erwähnt. Ich vermute, es ist eine bestimmte Mac OS-Version. Ich habe diese Antwort auch aktualisiert, da der Schlaf grundsätzlich in neuere Versionen von NodeJS integriert ist.
Ryan Shillington
62

Einfache und elegante Schlaffunktion mit modernem Javascript

function sleep(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

Keine Abhängigkeiten, keine Rückrufhölle; das ist es :-)


In Anbetracht des in der Frage angegebenen Beispiels würden wir auf folgende Weise zwischen zwei Konsolenprotokollen schlafen:

async function main() {
    console.log("Foo");
    await sleep(2000);
    console.log("Bar");
}

main();

Der "Nachteil" ist, dass Ihre Hauptfunktion jetzt auch sein muss async. Aber, wenn man bedenken Sie bereits modernen Javascript - Code schreiben, sind Sie wahrscheinlich (oder zumindest sollte es sein!) Mit async/ am awaitganzen Code, so ist dies nicht wirklich ein Problem. Alle modernen Browser unterstützen dies heute.

Dies ist die ausführliche Schreibweise, um einen kleinen Einblick in die sleepFunktion für diejenigen zu geben, die nicht daran gewöhnt sind, async/awaitund Fettpfeiloperatoren:

function sleep(millis) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () { resolve(); }, millis);
    });
}

Die Verwendung des Fettpfeil-Operators macht ihn jedoch noch kleiner (und eleganter).

Lucio Paiva
quelle
1
Sie können die Schlaffunktion auch ohne die schreiben asyncund alles andere gleich lassen. Es ist wahrscheinlich klarer mit dem asyncobwohl.
Kevin Peña
Guter Fang, @ KevinPeña. Tatsache ist, ich denke, ich bevorzuge es ohne async. Ich habe meine Antwort mit Ihrem Vorschlag bearbeitet. Ich denke nicht, dass es den Code klarer macht; Dafür würde ich stattdessen auf JSDoc zurückgreifen.
Lucio Paiva
8
Ich möchte den folgenden const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
Einzeiler
46

Sie können diese www.npmjs.com/package/sleep verwenden

var sleep = require('sleep');
sleep.sleep(10); // sleep for ten seconds
Aleksej
quelle
4
Es funktioniert einwandfreiMacOS , aber es treten FehlerCentOS aufgrund von node_gyp-Fehlern auf . Es scheint nicht tragbar.
AechoLiu
1
Vielleicht Problem nicht durch das Betriebssystem, sondern durch den Knotenaufbau verursacht
Aleksej
34

Diese Frage ist ziemlich alt, aber kürzlich hat V8 Generatoren hinzugefügt, die das erreichen können, was das OP angefordert hat. Generatoren sind im Allgemeinen am einfachsten für asynchrone Interaktionen mit Hilfe einer Bibliothek wie Suspend oder Gen-Run zu verwenden .

Hier ist ein Beispiel mit suspend:

suspend(function* () {
    console.log('Welcome to My Console,');
    yield setTimeout(suspend.resume(), 10000); // 10 seconds pass..
    console.log('Blah blah blah blah extra-blah');
})();

Verwandte Lektüre (durch schamlose Eigenwerbung): Was ist die große Sache mit Generatoren? .

jmar777
quelle
2
Gute Antwort - sollte aber lesenyield setTimeout(suspend.resume(), 10000);
edhubbell
1
Danke, @edhubbell. Diese Antwort basierte auf einer sehr alten Version von suspend, aber Sie haben Recht mit der neuesten. Ich werde die Antwort aktualisieren.
jmar777
Für welche Version des Knotens ist das?
danday74
1
@ danday74 Ich kann mich nicht genau erinnern, wann sie nicht markiert waren, aber sie gibt es seit Version 0.12 hinter der --harmonyFlagge, und laut node.green sind sie seit Version 4.8.4 zumindest ohne Flaggen verfügbar: node.green/#ES2015-functions-generators-basic-functionality . Bitte beachten Sie jedoch, dass die neuere async/awaitSyntax jetzt eine bessere Lösung dafür bietet, ohne dass zusätzliche Bibliotheken wie erforderlich sind suspend. In dieser Antwort finden Sie ein Beispiel: stackoverflow.com/a/41957152/376789 . Async-Funktionen sind seit Version 7.10 verfügbar (ohne Flags).
jmar777
20

Unter Linux / nodejs funktioniert das bei mir:

const spawnSync = require ('child_process'). spawnSync;

var sleep = spawnSync ('sleep', [1.5]);

Es blockiert, ist aber keine ausgelastete Warteschleife.

Die von Ihnen angegebene Zeit ist in Sekunden angegeben, kann jedoch ein Bruchteil sein. Ich weiß nicht, ob andere Betriebssysteme einen ähnlichen Befehl haben.

Bart Verheijen
quelle
sleepist so ziemlich allgegenwärtig und seit den frühen UNIX-Tagen ein nützlicher Ort . en.wikipedia.org/wiki/Sleep_%28Unix%29 . Nur "nicht selten", wie es vielleicht nicht existieren würde, sind Fenster (wie auch immer Sie es versuchen könntenchild_process.spawnSync('timeout', ['/T', '10'])
Menschheit
17

Wenn Sie Golf "codieren" möchten, können Sie hier eine kürzere Version einiger anderer Antworten erstellen:

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

Aber meiner Meinung nach ist die ideale Antwort die Verwendung der Node- utilBibliothek und ihrer promisifyFunktion, die genau für diese Art von Dingen entwickelt wurde (Versprechensbasierte Versionen von zuvor existierenden, nicht auf Versprechungen basierenden Dingen):

const util = require('util');
const sleep = util.promisify(setTimeout);

In beiden Fällen können Sie dann einfach anhalten, indem Sie awaitIhre sleepFunktion aufrufen :

await sleep(1000); // sleep for 1s/1000ms
Maschinenhost
quelle
Tatsächlich ist es mit util.promisify nicht möglich, den Ruhezustand aufzurufen, ohne auch einen Rückruf bereitzustellen. nodejs.org/api/…
Howie
1
Du vermisst das await. Es erstellt sozusagen einen Rückruf, hält die Dinge an und startet den Code neu, wenn dieser Rückruf zurückkehrt. Der Rückruf wird mit einem Wert zurückgegeben, aber in diesem Fall ist uns das egal, sodass links nichts steht await.
Machineghost
1
schreibe es in eine Zeile, um den Code golf zu trinken;) const sleep = require ('util'). promisify (setTimeout);
Fabian
14

Ich habe kürzlich eine einfachere Abstraktion namens wait.for erstellt , um asynchrone Funktionen im Synchronisationsmodus (basierend auf Knotenfasern) aufzurufen. Es gibt auch eine Version, die auf kommenden ES6-Generatoren basiert.

https://github.com/luciotato/waitfor

Mit wait.for können Sie jede asynchrone Standardfunktion von nodejs aufrufen, als wäre es eine Synchronisierungsfunktion, ohne die Ereignisschleife des Knotens zu blockieren.

Sie können bei Bedarf nacheinander codieren, was (ich vermute) perfekt ist, um Ihre Skripte für den persönlichen Gebrauch zu vereinfachen.

Verwenden Sie wait.for Ihr Code lautet :

require('waitfor')

..in a fiber..
//start-of-code
console.log('Welcome to My Console,');
wait.miliseconds(10*1000); //defined in waitfor/paralell-tests.js - DOES NOT BLOCK
console.log('Blah blah blah blah extra-blah');
//endcode. 

Auch jede Async-Funktion kann im Sync- Modus aufgerufen werden. Überprüfen Sie die Beispiele.

Lucio M. Tato
quelle
TypeError: Object #<Object> has no method 'miliseconds'
CaffeineAddiction
Der Kommentar lautet: "// definiert in waitfor / paralell-tests.js". Hol es dir aus dieser Datei.
Lucio M. Tato
2
Nachdem ich es von bekommen hatte, wait.for/paralell-tests.jsstieß ich auf einen anderen Fehler im Zusammenhang mit undefinierten Eigenschaften usw. Also musste ich sie auch kopieren. Warum organisieren Sie den Code nicht so, dass dies nicht erforderlich ist?
user907860
Wait.for und andere Faserlösungen haben mir eine ganz neue Welt eröffnet! Ich würde dies eine Million Mal abstimmen, wenn ich könnte. Obwohl die meisten der Nodejs gegen Fasern sind, denke ich, dass sie eine fantastische Ergänzung sind und definitiv ihren Platz haben, wenn es um die Rückrufhölle geht.
Levi Roberts
7

Da die Javascript-Engine (v8) Code basierend auf der Abfolge von Ereignissen in der Ereigniswarteschlange ausführt, gibt es keine Vorgabe, dass Javascript die Ausführung genau nach dem angegebenen Zeitpunkt auslöst. Wenn Sie also einige Sekunden festlegen, um den Code später auszuführen, basiert das Auslösen des Codes ausschließlich auf der Reihenfolge in der Ereigniswarteschlange. Das Auslösen der Codeausführung kann daher länger als angegeben dauern.

Also folgt Node.js,

process.nextTick()

um den Code später auszuführen, setzen Sie stattdessen setTimeout (). Zum Beispiel,

process.nextTick(function(){
    console.log("This will be printed later");
});
HILARUDEEN S ALLAUDEEN
quelle
2

Mit ES6-Unterstützung Promisekönnen wir sie ohne fremde Hilfe verwenden.

const sleep = (seconds) => {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, (seconds * 1000));
    });
};

// We are not using `reject` anywhere, but it is good to
// stick to standard signature.

Dann benutze es so:

const waitThenDo(howLong, doWhat) => {
    return sleep(howLong).then(doWhat);
};

Beachten Sie, dass die doWhatFunktion zum resolveRückruf innerhalb der wird new Promise(...).

Beachten Sie auch, dass dies ASYNCHRONER Schlaf ist. Die Ereignisschleife wird nicht blockiert. Wenn Sie den Schlaf blockieren müssen, verwenden Sie diese Bibliothek, die mithilfe von C ++ - Bindungen den Block blockiert. (Obwohl die Notwendigkeit eines blockierenden Schlafes in Node-ähnlichen asynchronen Umgebungen selten ist.)

https://github.com/erikdubbelboer/node-sleep

Baumkodierer
quelle
1
let co = require('co');
const sleep = ms => new Promise(res => setTimeout(res, ms));

co(function*() {
    console.log('Welcome to My Console,');
    yield sleep(3000);
    console.log('Blah blah blah blah extra-blah');
});

Dieser Code oben ist der Nebeneffekt der Lösung des Problems der asynchronen Rückruf-Hölle von Javascript. Dies ist auch der Grund, warum ich denke, dass Javascript eine nützliche Sprache im Backend ist. Tatsächlich ist dies meiner Meinung nach die aufregendste Verbesserung des modernen Javascript. Um vollständig zu verstehen, wie es funktioniert, muss die Funktionsweise des Generators vollständig verstanden werden. Das functionSchlüsselwort gefolgt von a *wird im modernen Javascript als Generatorfunktion bezeichnet. Das npm-Paket cobot eine Runner-Funktion zum Betreiben eines Generators.

Im Wesentlichen bot die Generatorfunktion eine Möglichkeit, die Ausführung einer Funktion mit einem yieldSchlüsselwort zu unterbrechen, während gleichzeitig yieldeine Generatorfunktion den Informationsaustausch zwischen dem Generator und dem Aufrufer ermöglichte. Dies stellte einen promiseAufruf für den Aufrufer bereit, Daten aus einem asynchronen Aufruf zu extrahieren und die aufgelösten Daten an den Generator zurückzugeben. Tatsächlich wird ein asynchroner Anruf synchronisiert.

Qian Chen
quelle
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Donald Duck
Danke @DonaldDuck. Der Code in meiner Antwort ist wahrscheinlich der aufregendste Teil der Verbesserung in Javascript. Ich bin so erstaunt, dass einige super kluge Leute über diesen Weg nachdenken, um das Problem der Rückrufhölle zu lösen.
Qian Chen
1

Dies ist ein Modul mit moment.js-Geschmack, das auf dem von @ atlex2 vorgeschlagenen Dirty-Blocking-Ansatz basiert . Verwenden Sie dies nur zum Testen .

const moment = require('moment');

let sleep = (secondsToSleep = 1) => {
    let sleepUntill = moment().add(secondsToSleep, 'seconds');
    while(moment().isBefore(sleepUntill)) { /* block the process */ }
}

module.exports = sleep;
Boaz - Monica wieder einsetzen
quelle
0

Wenn Sie die aktuelle Thread-Ausführung nur zu Testzwecken anhalten müssen, versuchen Sie Folgendes:

function longExecFunc(callback, count) {

    for (var j = 0; j < count; j++) {
        for (var i = 1; i < (1 << 30); i++) {
            var q = Math.sqrt(1 << 30);
        }
    }
    callback();
}
longExecFunc(() => { console.log('done!')}, 5); //5, 6 ... whatever. Higher -- longer
Ivan Talalaev
quelle
0

Einfach gesagt, wir werden 5 Sekunden warten, bis ein Ereignis eintritt (dies wird durch die Variable done angezeigt, die an einer anderen Stelle im Code auf true gesetzt ist) oder wenn das Timeout abläuft, werden wir alle 100 ms überprüfen

    var timeout=5000; //will wait for 5 seconds or untildone
    var scope = this; //bind this to scope variable
    (function() {
        if (timeout<=0 || scope.done) //timeout expired or done
        {
            scope.callback();//some function to call after we are done
        }
        else
        {
            setTimeout(arguments.callee,100) //call itself again until done
            timeout -= 100;
        }
    })();
Stan Sokolov
quelle
0

Bei einigen Personen funktioniert die akzeptierte Antwort nicht. Ich habe diese andere Antwort gefunden und sie funktioniert bei mir: Wie kann ich einen Parameter an einen setTimeout () - Rückruf übergeben?

var hello = "Hello World";
setTimeout(alert, 1000, hello); 

'Hallo' ist der Parameter, der übergeben wird. Sie können alle Parameter nach Ablauf der Zeitüberschreitung übergeben. Vielen Dank an @Fabio Phms für die Antwort.

Dazt
quelle
0

Anstatt all diese setTimeout-, Schlaf- und viele andere Dinge zu tun, ist es besser, sie zu verwenden

const delay = require('delay');
await delay(2000); // will wait for 2 seconds before executing next line of code
Rishab
quelle
Können Sie erklären, was "Verzögerung" ist, und auf seine Dokumente verlinken? Warum ist es besser?
Boycy
-2

Die anderen Antworten sind großartig, aber ich dachte, ich würde einen anderen Takt wählen.

Wenn alles, was Sie wirklich suchen, darin besteht, eine bestimmte Datei unter Linux zu verlangsamen:

 rm slowfile; mkfifo slowfile; perl -e 'select STDOUT; $| = 1; while(<>) {print $_; sleep(1) if (($ii++ % 5) == 0); }' myfile > slowfile  &

Knoten myprog slowfile

Dies wird alle fünf Zeilen 1 Sekunde lang schlafen. Das Knotenprogramm wird so langsam wie der Writer. Wenn es andere Dinge tut, werden sie mit normaler Geschwindigkeit fortgesetzt.

Das mkfifo erstellt eine First-In-First-Out-Pipe. Das macht diese Arbeit aus. Die Perl-Zeile schreibt so schnell, wie Sie möchten. Das $ | = 1 sagt, dass die Ausgabe nicht gepuffert werden soll.

Pete
quelle
-3

Nachdem ich die Antworten in dieser Frage gelesen habe, habe ich eine einfache Funktion zusammengestellt, die bei Bedarf auch einen Rückruf durchführen kann:

function waitFor(ms, cb) {
  var waitTill = new Date(new Date().getTime() + ms);
  while(waitTill > new Date()){};
  if (cb) {
    cb()
  } else {
   return true
  }
}
Netsi1964
quelle
-4

Für weitere Informationen über

yield sleep(2000); 

Sie sollten Redux-Saga überprüfen . Es ist jedoch spezifisch für Ihre Wahl von Redux als Modell-Framework (obwohl dies unbedingt nicht erforderlich ist).

Arseni Buinitski
quelle