2015-11-07 14 views
5

Ho il seguente codice Node.js che si comporta stranamente:input dell'utente con 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(); 

Voglio imitare Python di raw_input, vale a dire la lettura di una linea da parte dell'utente. Dopo aver mostrato la richiesta, il programma dovrebbe essere bloccato fino a quando l'utente non preme Invio.

Se la "riga problematica" è nei commenti, funziona, il programma è in attesa di input. Tuttavia, se questa riga non è nei commenti, il programma non attende l'input e n diventa undefined. Perché? Come scrivere una funzione che restituisce l'input dell'utente?

risposta

3

Questo perché si aspetta l'esecuzione dell'input attendere fino a quando viene chiamato return, che non è il modo in cui funzionerà. La linea problematica è in effetti la precedente. Innanzitutto, l'input non restituisce nulla, l'istruzione return è il ritorno della funzione di callback della domanda, ma poi, sembra che tu abbia frainteso il flusso di esecuzione, come tutti noi abbiamo ad un certo punto (lo otterrai abbastanza velocemente dopo un po 'di dead- finisce come questo)

  1. lo script viene caricato
  2. dichiarate e definire rl, in ingresso e principale esegue
  3. principale
  4. si definisce n come il risultato di ingresso e qui è dove le cose inizia a diventare asincronamente divertente
    1. dal domanda è asincrona, è inizio di esecuzione, ma non blocca il processo di
    2. ingresso ritorna indefinito (mentre si è ancora in attesa per l'ingresso)
    3. si stampa che non definito
    4. si scrive qualcosa sul ingresso
    5. questione() termina la sua esecuzione e chiama la callback (la funzione che hai dato come secondo parametro)
    6. rl è chiuso
    7. la funzione di callback restituisce la linea, ed è inghiottito dal vuoto (non si tratta di terminologia tecnica, solo una metafora)

Si consiglia di fare in questo modo:

#!/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(); 

Se sei nuovo di javascript e nodo, è può trovare molto utile usare learnyounode e lo node code school path o anche, se si ha il tempo, i soldi e l'opportunità, leggere Node.js, MongoDB, and AngularJS Web Development, da Brad Dayley.

+0

Grazie, ma come fare qualcosa con 'n' dopo? Per esempio, se aggiungo questa riga alla fine di 'main()': 'console.log (Number (n) +1);', quindi è di nuovo problematico. O se voglio leggere due numeri e aggiungere 'n1' e' n2' e stampare il risultato in 'main'. Sì, sono nuovo e grazie per i link utili. – Jabba

+1

Tutto ciò che dovrete fare in seguito deve essere fatto in un callback. Invece di passare console.log, passare una funzione personalizzata con le operazioni successive. –

+0

Se si passa, ad esempio, al main stesso, si otterrà un prompt di pappagallo che ripete l'input e chiede di nuovo. Se passi una funzione effettuando una chiamata di sistema con il tuo input, e chiamando main successivamente otterrai una shell, e così via ... –