2015-11-07 5 views
5

У меня есть следующий код Node.js, который ведет себя странно:пользовательский ввод с 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(); 

Я хочу, чтобы имитировать Питона raw_input, то есть чтение строки от пользователя. После показа подсказки программа должна быть заблокирована до тех пор, пока пользователь не нажмет клавишу Enter.

Если «проблемная строка» находится в комментариях, она работает, программа ждет ввода. Однако, если эта строка не в комментариях, то программа не ждет ввода и n становится undefined. Зачем? Как написать функцию, которая возвращает пользовательский ввод?

ответ

3

Это потому, что вы ожидаете выполнения ввода до тех пор, пока не будет вызван возврат, что не будет работать. Проблемная линия действительно является предыдущей. Во-первых, вход ничего не возвращает, оператор return является возвратом функции обратного вызова вопроса, но тогда вы, кажется, неправильно понимаете поток выполнения, как и все мы в какой-то момент (вы получите это довольно быстро после некоторых мертвых, заканчивается как этот)

  1. Ваш скрипт загружается
  2. Вы заявляете и определить Р.Л., вход и главный
  3. Main выполняет
  4. определяются п в результате ввода а вот где вещи начать получать асинхронно смешно
    1. поскольку вопрос является асинхронным, это начало выполнения, но не блокирует процесс
    2. вход возвращает неопределенное (в то время как вы все еще ждет ввода)
    3. печати, что не определено
    4. Вы пишете что-то на вход
    5. вопрос() завершает свое выполнение и вызовов (функция, которую вы дали в качестве второго параметра)
    6. ого закрыт
    7. функции обратного вызова возвращает строку, обратный вызов и он проглотил в пустоте (это не техническая терминология, просто метафора)

Вы можете сделать это следующим образом:

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

Если вы новичок в яваскрипт и узел, вы может оказаться очень полезным использовать learnyounode и node code school path или даже, если у вас есть время, деньги и возможность, читайте Node.js, MongoDB, and AngularJS Web Development, автор Brad Dayley.

+0

Спасибо, но как сделать что-нибудь с 'n' после? Например, если я добавлю эту строку в конец 'main()': 'console.log (Number (n) +1);', то это снова проблематично. Или если я хочу прочитать два числа и добавить 'n1' и' n2' и напечатать результат в 'main'. Да, я новичок в этом и благодарю за полезные ссылки. – Jabba

+1

Все, что вы должны делать после этого, должно выполняться в обратном вызове. Вместо передачи console.log передайте пользовательскую функцию со следующими операциями. –

+0

Если вы пройдете, например, сам по себе, вы получите приглашение довольно попугаю, повторяющее ввод и повторное задание. Если вы передадите функцию с системным вызовом с вашим вводом, а затем вызовите main, вы получите оболочку и так далее ... –

 Смежные вопросы

  • Нет связанных вопросов^_^