2016-08-12 6 views
0

予期せぬ動作が発生したときにノードプログラムにコマンドラインインターフェイスを作成していました。Writing CLI:再帰関数の予期しない動作

私はnumInputsLeftをデクリメントすることが期待
// 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); 
} 

:など14、13、12、 代わりに、numInputs左が14、14、14で貼り付けたが、その他

このエラーが発生する理由とどのように私は解決することができますそれ?

答えて

0

実際の問題は、我々はどこにでも結果を保存していないので、それは、= 2のみ3-1になるたびにラインここ

nextInput(consoleOutputs, numInputsLeft-1); 

です。したがって毎回同じ価値があります。

私はこのコードで試してみました。

このご協力をお願いします。

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

あなたのソリューションは私のために働いた。しかし、私はまだ混乱しています。私は、再帰呼び出しでnumInputsLeft:= numInputsLeft-1を期待していました。たとえば、次のようになります。 function series(n){ \t if(n == 1){return 1; } \t return n * series(n-1); } 各再帰呼び出しでn:= n-1。 series(4)は24を返します。 nextInputは非同期コールバックで "再帰"が発生するため、実際の再帰関数ではないためですか? – George

関連する問題