Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 逐行节点JS提示输入不起作用_Javascript_Node.js_User Input_Line By Line - Fatal编程技术网

Javascript 逐行节点JS提示输入不起作用

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,

我已经开始使用NodeJS,并且正在使用逐行依赖关系。我已经正确安装了一行一行,它在文件夹中。目前,我的应用程序将运行,但不会提示用户输入答案。我的代码如下:

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”语句移到了最后一个回调中,并从脚本底部删除了它吗?啊!你是对的,我不小心漏掉了结束语。非常感谢。不客气!