Wie man ein node.js Skript am Leben, während verspricht aufgelöst wird?
Mein Skript führt einige asynchrone Aufgaben mit verspricht (mit der q-Bibliothek). Läuft mocha tests gut funktioniert. Allerdings läuft das Skript von der Befehlszeile nicht. Der node-Prozess sofort stirbt.
var bot = require('./bot');
bot.getCategories().then(function (categories) {
console.log('Found ' + categories.length + ' categories');
});
- Was ist
./bot
, was tut Sie? Funktioniert dein Skript stirbt auch, wenn Ihr ersetzenbot.getCategories()
mitQ.resolve()
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist sicherlich ein bug, bitte melden. Die Node.js Umgebung sollte nicht vorzeitig beenden, während es gibt Dinge, die noch in der Warteschlange in der event-Schleife.
Sollten Sie nicht ändern Sie Ihren code ein bit für diese zu passieren. Die Q-Bibliothek (denken Sie daran, es gibt mehr moderne und nativen alternativen heute) Zeitpläne von asynchronen callbacks auf der
process.nextTick
"microtask" - Warteschlange. Ihre bot-Bibliothek vermutlich führt auch IO, beides sollte dazu führen, dass Knoten nicht zu beenden.bot.getCategories()
, nicht in Knoten. Vielleicht das Versprechen, nie aufgelöst, dann Q nicht planen microtask entweder.bot.getCategories
verweist auf ein systemeigenes Modul dann jeden bug, den es hat, ist noch ein Knoten bug, da Knoten sollte sich bewusst sein, alle ausstehenden E / a-Ereignisse. Wenn es ein Standard-Modul, dann könnte es ein Fehler gibt (allerdings die meisten Menschen nutzen nur sehr wenige native Module). Diese Tatsache, diese Art von Fehler in Knoten sind nicht sehr selten, fügt auch mein Verdacht (dass Sie behandelt erhalten schnell obwohl).bot
zieht sich die Daten aus dem web, würde das zählen als IO?Node.js wird beendet, wenn es keine mehr Rückrufe zu verarbeiten. Du kannst mit setInterval oder setTimeout, um zu halten stets ein, so dass der Prozess nicht automatisch beendet.
Lassen Sie uns so anfangen:
unten wir tun...
Endet A) - einfache Versprechen
start und Ende wird sofort angezeigt.
es dauert eine weitere Sekunde, um zu sehen, 'howdy' und unsere terminal-prompt zurück. (also in dem Sinne das script am Leben gehalten wird, aber vermutlich nicht das, was der OP will...)
Ende B) - warten auf das Versprechen zurück
starten, erscheint nach 1 Sekunde 'howdy' wird angezeigt. 'end' ist nicht erreichbar. Damit wir hier wirklich warten, bis die Versprechen und könnte Dinge tun, mit denen...
Ende C) - dann()
start erscheint, eine Sekunden vergeht und 'howdy', 'Ende' und 'fertig' angezeigt. Und könnte verwendet werden, um senden Sie eine Rückkehr Wert.
Fast sicher, Sie wollen eine
.catch()
nach der.then()
im Falle der Versprechen wird abgelehnt... (und Rücksendung eines von null verschiedenen exit-code, nur in diesem Fall)Statt einer einzigen Versprechen, wie
timeoutPromises(…)
Sie konnte natürlichVersprechen.alle(...)
oder ein async - /await-Funktion (die muss gewickelt werden wieder Versprechungen, die sich irgendwo auf dem hierarchischen Weg... Sie haben das bedeckt auch hier).