2015-11-07 22 views
5

ich folgende Node.js Code haben, der seltsam verhält:Benutzereingabe mit node.js

#!/usr/bin/env node 

"use strict"; 

var readline = require('readline'); 

var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
}); 

function input(prompt) { 
    rl.question(prompt, function (x) { 
     rl.close(); 

     console.log("debug: " + x); 
     return x; 
    }); 
} 

function main() { 
    var n = input("Number: "); 
// console.log("value: " + n); // problematic line 
} 

main(); 

Ich möchte raw_input Pythons imitieren, das heißt eine Linie vom Benutzer zu lesen. Nachdem die Eingabeaufforderung angezeigt wurde, sollte das Programm blockiert werden, bis der Benutzer die Eingabetaste drückt.

Wenn die "problematische Linie" in Kommentaren ist, funktioniert es, das Programm wartet auf Eingabe. Wenn diese Zeile jedoch nicht in Kommentaren enthalten ist, wartet das Programm nicht auf Eingabe und n wird undefined. Warum? Wie schreibe ich eine Funktion, die die Benutzereingabe zurückgibt?

Antwort

3

Das ist, weil Sie erwarten, dass die Ausführung der Eingabe warten, bis Return aufgerufen wird, was nicht funktioniert. Die problematische Linie ist in der Tat die vorherige. Zuerst gibt die Eingabe nichts zurück, die return-Anweisung ist die Rückkehr der Frage-Callback-Funktion, aber dann scheinen Sie den Ausführungsfluss falsch zu verstehen, wie wir alle irgendwann haben (Sie werden es ziemlich schnell nach einigen Dead- endet wie dieser)

  1. Ihr Skript
  2. geladen wird Sie erklären und rl, Eingangs- und Haupt
  3. Haupt führt
  4. Sie definieren n als Ergebnis der Eingabe und hier ist definieren, wo die Dinge anfangen, asynchron lustig zu bekommen
    1. seit Frage asynchron ist, ist es Anfang der Ausführung aber nicht blockiert den Prozess
    2. Eingang undefined zurück (während Sie warten immer noch auf den Eingang)
    3. Sie drucken, dass undefined
    4. Sie schreiben etwas auf die
    5. Eingang
    6. Frage() beendet seine Ausführung und ruft den Callback (die Funktion, die Sie als zweiter Parameter gibt)
    7. rl
    8. die Callback-Funktion geschlossen wird, gibt die Linie, und es geschluckt wird durch den Hohlraum (ist dies nicht der Fachsprache, nur eine Metapher)

Vielleicht möchten Sie es wie folgt tun:

#!/usr/bin/env node 

"use strict"; 

var readline = require('readline'); 

var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
}); 

function input(prompt, callback) { 
    rl.question(prompt, function (x) { 
     rl.close(); 
     callback(x); 
    }); 
} 

function main() { 
    var n = input("Number: ", console.log); 
} 

main(); 

Wenn Sie Javascript und Knoten neu sind, Sie kann sehr nützlich sein zu verwenden learnyounode und die node code school path oder sogar, wenn Sie die Zeit haben, das Geld und die Gelegenheit, lesen Sie Node.js, MongoDB, and AngularJS Web Development, von Brad Dayley.

+0

Danke, aber wie macht man danach alles mit 'n'? Wenn ich zum Beispiel diese Zeile am Ende von 'main()': 'console.log (Number (n) +1);' 'anfüge, ist es wieder problematisch. Oder wenn ich zwei Zahlen lesen und 'n1' und' n2' hinzufügen und das Ergebnis in 'main' drucken möchte. Ja, ich bin neu und danke für die nützlichen Links. – Jabba

+1

Alles, was Sie danach tun müssen, muss in einem Callback erfolgen. Übergeben Sie console.log nicht, übergeben Sie eine benutzerdefinierte Funktion mit den nächsten Operationen. –

+0

Wenn Sie zum Beispiel selbst main übergeben, erhalten Sie eine schöne Papagei-Eingabeaufforderung, in der Sie Ihre Eingabe wiederholen und erneut fragen. Wenn Sie eine Funktion übergeben, die mit Ihrer Eingabe einen Systemaufruf macht, und danach main aufrufen, erhalten Sie eine Shell und so weiter ... –