var readline = require('readline');
var log = console.log;
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var recursiveAsyncReadLine = function() {
rl.question('Command: ', function (answer) {
if (answer == 'exit') //we need some base case, for recursion
return rl.close(); //closing RL and returning from function.
log('Got it! Your answer was: "', answer, '"');
recursiveAsyncReadLine(); //Calling this function again to ask new question
});
};
recursiveAsyncReadLine(); //we have to actually start our recursion somehow
Der Schlüssel ist, keine synchronen Schleifen zu verwenden. Wir sollten als nächstes rl.question
nur nach dem Beantworten fragen. Rekursion ist der Weg zu gehen. Wir definieren eine Funktion, die die Frage stellt und die Antwort behandelt, und rufen sie dann nach der Antwortbehandlung von innen heraus auf. So fangen wir von vorne an, genau wie bei der normalen Schleife. Schleifen kümmern sich jedoch nicht um den anysyc-Code, während sich unsere Implementierung darum kümmert.
was, wenn Sie readline.question() erneut, bevor der Benutzer reagieren auf einen vorherigen Anruf rufen geschieht dann? –
Ich bin kein Experte für Knoten oder js - aber ich stelle mir vor, die "nächste" konkurriert um die Schnittstelle; also kann nur einer auf einmal schreiben (und derselbe bekommt die Antwort, vorausgesetzt, er wird im Callback behandelt). Wenn es fertig ist, wartet der nächste. – OJFord
Dies funktioniert, aber dies fügt jedes Mal, wenn ein Befehl eingegeben wird, einen neuen Aufrufstack hinzu, wodurch möglicherweise ein Stapelüberlauf erreicht wird, wenn zu viele Befehle eingegeben werden. Gibt es keine Konstant-Stack-Lösung mit rl.question()? – Javarome