如何在Node.js中无限读取行

如何在Node.js中无限读取行,node.js,nonblocking,Node.js,Nonblocking,刚试过这段代码,但不是一个接一个地输入,而是闪烁“Command:”行。我知道node.js是非阻塞的,但我不知道如何解决这个问题 while(1){ rl.question("Command: ",function(answer){ console.log(answer); }) } 关键是不要使用同步循环。我们应该在处理完答案后再问下一个问题。递归是一种方法。我们定义了一个函数,该函数询问问题并处理答案,然后在答案处理后从内部调用它。这样我们就可以从头开始,就像常规

刚试过这段代码,但不是一个接一个地输入,而是闪烁“Command:”行。我知道node.js是非阻塞的,但我不知道如何解决这个问题

while(1){
    rl.question("Command: ",function(answer){
    console.log(answer);
    })
}

关键是不要使用同步循环。我们应该在处理完答案后再问下一个问题。递归是一种方法。我们定义了一个函数,该函数询问问题并处理答案,然后在答案处理后从内部调用它。这样我们就可以从头开始,就像常规循环一样。但是循环并不关心ansyc代码,而我们的实现关心它。

另一个选项,通过Node.js文档,是使用:


以下是使用异步生成器函数的版本:

var readline = require('readline'),
    rl = readline.createInterface(process.stdin, process.stdout);

rl.setPrompt('OHAI> ');
rl.prompt();

rl.on('line', function(line) {
    switch(line.trim()) {
        case 'hello':
            console.log('world!');
            break;
        default:
            console.log('Say what? I might have heard `' + line.trim() + '`');
        break;
    }
    rl.prompt();
}).on('close', function() {
    console.log('Have a great day!');
    process.exit(0);
});
可用于以下情况:

async function* questions(query: string) {
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });

  try {
    for (;;) {
      yield new Promise((resolve) => rl.question(query, resolve));
    }
  } finally {
    rl.close();
  }
}

在用户响应之前再次调用readline.question()会发生什么情况?我不是node或js方面的专家,但我认为“下一个”用户正在争夺接口;因此,一次只有一个人可以写出答案(如果答案在回调中得到处理,同一个人也可以得到答案)。当它完成时,下一个正在等待。这可以工作,但每次输入命令时都会添加一个新的调用堆栈,因此如果输入的命令太多,可能会导致堆栈溢出。是否存在使用rl.question()的常量堆栈解决方案?它不会在@Javarome:recursiveAsyncReadLine()的每次执行打印问题、注册回调并立即结束时向堆栈添加调用<代码>recursiveAsyncReadLine()由回调函数调用,而不是由回调函数本身调用。您可以通过在每次调用时打印堆栈来验证它:
const stack=new Error().stack;控制台日志(堆栈)谢谢,这对我尝试做的很有效。我与基于事件的回调建立了tcp连接。很高兴能够使用事件而不是循环来完成此操作。:-)由于某些原因,我只有在按下
DEL
时才会收到提示。这是我的最佳答案。不使用递归和优雅的解决方案。
async function* questions(query: string) {
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });

  try {
    for (;;) {
      yield new Promise((resolve) => rl.question(query, resolve));
    }
  } finally {
    rl.close();
  }
}
async function run() {
  for await (const answer of questions("Command: ")) {
    console.log(`I heard ${answer}`);
    if (answer == "done") break;
  }
}

run(); // For the sake of example, start the async function at the top level of nodejs script