Javascript 逐行节点JS提示输入不起作用
我已经开始使用NodeJS,并且正在使用逐行依赖关系。我已经正确安装了一行一行,它在文件夹中。目前,我的应用程序将运行,但不会提示用户输入答案。我的代码如下:Javascript 逐行节点JS提示输入不起作用,javascript,node.js,user-input,line-by-line,Javascript,Node.js,User Input,Line By Line,我已经开始使用NodeJS,并且正在使用逐行依赖关系。我已经正确安装了一行一行,它在文件夹中。目前,我的应用程序将运行,但不会提示用户输入答案。我的代码如下: var rlname; var rlage; var rlcolor; // Create reading interface const readline = require('readline'); const rl = readline.createInterface ({ input: process.stdin,
var rlname;
var rlage;
var rlcolor;
// Create reading interface
const readline = require('readline');
const rl = readline.createInterface ({
input: process.stdin,
output: process.stdout,
prompt: '>'
});
// Ask a question
function getUserInput()
{
rl.question("What is your name? \n", (name) => {
console.log(name);
rlname = name;
// Log answer in JSON
})
rl.question("What is your age? \n", (age) => {
console.log(age);
rlage = age;
// Log answer in JSON
})
rl.question("What is your favorite color? \n", (color) => {
console.log(color);
rlcolor = color;
// Log answer in JSON
})
console.log("Hello " + rlname + ", you are " + rlage + " years old and your favorite color is " + rlcolor + ".");
}
getUserInput();
rl.close();
这是产生的结果:
What is your name?
Hello undefined, you are undefined years old and your favorite color is undefined.
这里的问题是,
readline.question
是异步的,您需要等待每个回调返回,然后才能(a)使用输入和(b)创建下一个问题。但是,您正在执行console.log语句,直接在调用question
之后执行。这可能是将问题
包装成承诺的最简单方法,这样您就可以等待回答了
下面是一个使用承诺的示例:与Node.js中的许多模块一样,
readline
在回调的基础上工作。传递给rl.question
的回调函数不会立即运行;仅当从用户接收到输入时才调用它们。因此,您的程序试图一次问三个问题,然后在收到任何答案之前立即记录“Hello”行。(您可能没有看到第二个或第三个问题,因为readline为它们提供了一些内部缓冲区。)
对于回调,正确的方法是如下嵌套:
var-rlname;
变量年龄;
颜色;
//创建阅读界面
const readline=require('readline');
const rl=readline.createInterface({
输入:process.stdin,
输出:process.stdout,
提示:'>'
});
//提问
函数getUserInput()
{
rl.问题(“你叫什么名字?\n”,(名字)=>{
console.log(名称);
rlname=名称;
rl.问题(“你的年龄是多少?\n”,(年龄)=>{
控制台日志(年龄);
年龄=年龄;
rl.question(“你最喜欢的颜色是什么?\n”,(颜色)=>{
控制台。日志(颜色);
rlcolor=颜色;
log(“你好”+rlname+”,你是“+rlage+”岁,你最喜欢的颜色是“+rlcolor+”);
rl.close();
})
})
})
}
getUserInput();
(请注意,rl.close
在所有问题都被询问之前无法调用,因此在最内部的回调中。)
使用带有承诺的
async
函数将使这一点更容易实现,而不需要嵌套函数和深度缩进。这里的问题是由于这段代码应该是异步的,但编写时就好像它是同步的一样
更清楚地说:您要求输入名称,但代码没有等待输入,因为它是异步的。它继续执行console.log语句,并继续使用rl.close()
关闭输入
您应该将每个问题放在前一个问题的回调中,并在最后一个回调中放在结束语句中:
var rlname;
var rlage;
var rlcolor;
// Create reading interface
const readline = require('readline');
const rl = readline.createInterface ({
input: process.stdin,
output: process.stdout,
prompt: '>'
});
// Ask a question
function getUserInput()
{
// FIRST QUESTION
rl.question("What is your name? \n", (name) => {
console.log(name);
rlname = name;
// SECOND QUESTION
rl.question("What is your age? \n", (age) => {
console.log(age);
rlage = age;
// THIRD QUESTION
rl.question("What is your favorite color? \n", (color) => {
console.log(color);
rlcolor = color;
// LOG DATA
console.log("Hello " + rlname + ", you are " + rlage + " years old and your favorite color is " + rlcolor + ".");
// CLOSE CONNECTION
rl.close();
})
})
})
}
getUserInput();
现在一次只执行一条语句,但代码只是停止,而不是请求用户输入。你能理解为什么吗?这确实很奇怪。我在发布之前测试了这段代码,我又测试了一遍,在我的电脑上运行正常。你确定你把“rl.close”语句移到了最后一个回调中,并从脚本底部删除了它吗?啊!你是对的,我不小心漏掉了结束语。非常感谢。不客气!