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?


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.


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:


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));

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);

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!


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.


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).


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


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? .


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.


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

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.


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");
});

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


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.


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


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

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;
        }
    })();

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.


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

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.


-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
  }
}

-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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.