2017-02-01 30 views
0

Я надеялся увидеть, может ли Node.js приостановить выполнение сценария после того, как он попадет в блок process.stdin для ввода пользовательского ввода для приложений командной строки, аналогично тому, как prompt() работает с JS в браузер или как получает работает в Ruby.Есть ли способ приостановить запуск сценария с process.stdin для ввода пользователем в Node.js?

var response = ''; 

    console.log("What's your favorite color?"); 

    process.stdin.resume(); 
    process.stdin.setEncoding('utf8'); 

    process.stdin.on('data', function (text) { 
    response = text; 
    process.exit(); 
    }); 

    console.log(`Cool! So ${response} is your favorite color? Mine is black.`); 

В простом сценарии выше, я надеюсь увидеть

What's your favorite color? 
*pause for user input ===>* Red 
Cool! So Red is your favorite color? Mine is black. 

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

What's your favorite color? 
Cool! So is your favorite color? Mine is black. 

немедленно распечатано и THEN принимает от пользователя ввода.

Я знаю, есть и другие модули, такие как Readline и оперативного, которые упрощают принятие на входе пользователя для узла. В этом вопросе я особенно надеюсь, что Node.js предложит эту функциональность без установки дополнительных пакетов (process.stdin - это первое, что приходит на ум), хотя было бы полезно узнать, предоставляют ли какие-либо модули это как функциональность.

ответ

0

Вы можете использовать Readline синхронизации.

var rl = require('readline-sync'); 
var response = ''; 

response = rl.question("What's your favorite color?"); 

console.log(`Cool! So ${response} is your favorite color? Mine is black.`); 
+0

Это определенно соответствует функциональности счета. Но знаете ли вы, есть ли способ достичь этого, не устанавливая такой пакет, как readline-sync? Просто с узлом? –

+0

Установка пакетов является общей задачей в узле. Не беспокойтесь об этом, @CaryMeskell. – gustavohenke

0

Просто ждать, прежде чем продолжить стандартный ввод сценария

var response = ''; 

    console.log("What's your favorite color?"); 

    process.stdin.resume(); 
    process.stdin.setEncoding('utf8'); 

    process.stdin.on('data', function (text) { 
    response = text; 
    console.log(`Cool! So ${response} is your favorite color? Mine is black.`); 
    process.exit(); 
    }); 
+0

Хм, это хорошо подходит для небольшого примера. Но если скрипт был намного больше, и у меня было много вопросов и ответов, я не уверен, что он будет корректно работать –

+0

@CaryMeskell, это распространенная проблема с приложениями Node - он не имеет синхронного ввода-вывода. Поэтому вам нужно найти хороший способ справиться с этим (обещания, больше обработчиков событий, некоторый пакет, такой как 'async' и т. Д.). – gustavohenke