2016-08-12 1 views
0

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?

Antwort

0

Eigentlich ist das Problem der Linie

nextInput(consoleOutputs, numInputsLeft-1); 

Hier wird jedes Mal nur 3-1 = 2, sein, weil wir nicht die Ergebnisse überall zu speichern sind. Es ist also immer der gleiche Wert.

Ich versuchte mit diesem Code und es funktioniert gut für mich.

Bitte versuchen Sie diese Hoffnung, es hilft.

function main(callback) { 
this.args = []; // store CL args 
this.consoleOutputs = ["Enter input1: ", "Enter input2: ", "enter input3: "]; 
this.numInputsLeft = consoleOutputs.length; 

this.nextInput = function(consoleOutputs, numInputsLeft) { 

    if (numInputsLeft == 0) { 
     console.log("Ends here !!"); 
     process.stdin.removeAllListeners('readable') 
     return callback(null, args); 
    } 

    console.log(consoleOutputs[consoleOutputs.length-numInputsLeft]); 

    process.stdin.on('readable', function() { 
     var text = process.stdin.read(); 
     if (text !== null) { 
      args.push(text.toString().trim()); 
      numInputsLeft--; 
      nextInput(consoleOutputs, numInputsLeft); 
     } 
    }); 
} 

nextInput(this.consoleOutputs, this.numInputsLeft); 
} 

    main(function (arg1, arg2) { 
     // console.log(arg1); 
     console.log(arg2); 
    }); 
+0

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