Ich schrieb eine Befehlszeilenschnittstelle zu meinem Knotenprogramm, wenn ich auf unerwartetes Verhalten stieß.Schreiben CLI: rekursive Funktion unerwartetes Verhalten
// Starts command line prompt bot
// @param {Function} callback - callback upon finshing CL inputs
function main(callback) {
this.args = []; // store CL args
this.consoleOutputs = ["Enter input1: ", "Enter input2: ", "enter input3: "];
this.nextInput = function(consoleOutputs, numInputsLeft) {
if (numInputsLeft == 0) { callback.apply(null, args); } // done, stop recursing and run callback
// write output to prompt user
process.stdout.write(consoleOutputs[consoleOutputs.length-numInputsLeft]);
process.stdin.on('readable', function() {
var text = process.stdin.read();
if (text !== null) {
console.log(numInputsLeft);
args.push(text);
// recurse to print next output and wait for next input
nextInput(consoleOutputs, numInputsLeft-1);
}
});
}
nextInput(this.consoleOutputs, consoleOutputs.length);
}
Ich erwartete numInputsLeft zu verringern: 14, 13, 12, usw. Stattdessen numInputs Linke bei 14, 14, 14 festsaß usw.
Warum dies geschieht und wie kann ich lösen es?
Ihre Lösung arbeitete für mich. Ich bin jedoch immer noch verwirrt. Ich erwartete numInputsLeft: = numInputsLeft-1 für den rekursiven Aufruf. Zum Beispiel: Funktionsserie (n) { \t if (n == 1) {return 1; } \t Rückkehr n * Reihe (n-1); } n: = n-1 bei jedem rekursiven Aufruf. series (4) gibt 24 zurück. Liegt es daran, dass nextInput keine echte rekursive Funktion ist, weil die "Rekursion" in einem asynchronen Callback stattfindet? – George