Arbeits Zu wissen, dass während Node.js asynchron arbeitet, so etwas wie dieses zu schreiben:node.js: while-Schleife Rückruf nicht wie erwartet
function sleep() {
var stop = new Date().getTime();
while(new Date().getTime < stop + 15000) {
;
}
}
sleep();
console.log("done");
... würde den Schlaf() aufrufen, blockieren den Server für die Dauer der While-Schleife (15 Sekunden) und DANN drücke "Done" auf die Konsole. Soweit ich das verstehe, liegt das daran, dass Node.js JavaScript nur den Zugriff auf den Hauptthread gewährt, und daher würde diese Entführung die weitere Ausführung stoppen.
So verstehe ich die Lösung dieses Problems ist Rückrufe zu verwenden:
function sleep(callback) {
var stop = new Date().getTime();
while(new Date().getTime() < stop + 15000) {
;
}
callback();
}
sleep(function() {
console.log("done sleeping");
});
console.log("DONE");
Also dachte ich, das wäre ‚DONE‘ und nach 15 Sekunden drucken. 'done sleeping', da die Funktion sleep() aufgerufen wird und ein Zeiger auf eine Callback-Funktion übergeben wird. Während diese Funktion arbeitet (die while-Schleife), wird die letzte Zeile ausgeführt (print 'done'). Nach 15 Sekunden, wenn die Funktion sleep() beendet ist, ruft sie die angegebene Callback-Funktion auf, die dann 'done sleeping' ausgibt.
Anscheinend habe ich hier etwas falsch verstanden, weil beide der oben genannten Möglichkeiten blockieren. Kann jemand bitte klären?
Vielen Dank im Voraus, Slagjoeyoco
Sie sind selbst zu verkomplizieren. Ein einfaches setTimeout (Callback, Delay) sollte ausreichen, um dasselbe wie asynchron zu erzeugen. –
@ FabiánH.jr. Der Punkt ist OP könnte daran interessiert sein, zu verstehen, warum sein 'while' nicht funktioniert und wie ein' while' auf nicht-blockierende Weise geschrieben werden kann, was imho irgendwie eine bessere Antwort ist als "es spielt keine Rolle für Ihre Methode funktioniert nicht, mach es stattdessen anders. – Mahn
Nun, wahr, große Antwort insgesamt und jetzt, dass Sie es erwähnen, war es ziemlich aufschlussreich in den inneren Prozess von node.js –