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