如何使用nodejs readline库通过return函数从stdin读取

时间:2018-02-10 16:25:23

标签: javascript node.js readline

var readline = require('readline');
var reader = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});
function stdinput(){
    reader.on('line', function (cmd) {
        return cmd;
      });
}
console.log(stdinput());

输出:

  

未定义

stdinput()函数在从stdin读取输入之前给出“undefined”。 我搜索了许多资源但却无法理解为什么它会异步解释。

  

我在nodejs中编写CLI交互式应用程序。它多次读取输入 。如果我们使用递归来读取,它需要更多的堆栈内存,如果我们使用回调,Promise和Async / await在stdinput()之前也会得到 undefined ,即在读取输入之前首先执行部分代码

2 个答案:

答案 0 :(得分:1)

或者你可以使用回调:

var readline = require('readline');
var reader = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});

function stdinput(callback){
    reader.on('line', function (cmd) {
        callback (cmd);
      }); 
}

stdinput(function (cmd) {
    console.log('cmd: ', cmd); 
});

答案 1 :(得分:0)

这是因为函数stdinput在reader.on('line',..事件发生之前返回。尝试这种方法:

var readline = require('readline');
var reader = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: true
});


function stdinput(){
    return new Promise((resolve) => {
        reader.on('line', function (cmd) {
            resolve(cmd);
        });
    });
}

stdinput().then((cmd) => console.log("cmd: ", cmd))

你也可以尝试这种方法:

function processInput(cmd) {
    // Do something cool with the cmd
    //
    //
    console.log('processInput: command: %s processed', cmd);
}

function stdinput(){
    reader.on('line', function (cmd) {
        console.log('cmd: ', cmd);
        processInput(cmd);
    });
}

或者这个:

var askForName = () => console.log("What's your name? ");
function sayHello(){
    askForName();
    reader.on('line', function (name) {
        console.log('Hello ' + name + "!");
        askForName();
    });
}

sayHello();

为了说清楚,原来的stdInput有效地返回undefined,因为它退出而没有设置返回值,这就是你将这个结果记录到控制台的原因。