使用node.js进行用户输入

使用node.js进行用户输入,node.js,input,raw-input,Node.js,Input,Raw Input,我有以下Node.js代码,其行为异常: #!/usr/bin/env node "use strict"; var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); function input(prompt) { rl.question(prompt, function (x)

我有以下Node.js代码,其行为异常:

#!/usr/bin/env node

"use strict";

var readline = require('readline');

var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

function input(prompt) {
    rl.question(prompt, function (x) {
        rl.close();

        console.log("debug: " + x);
        return x;
    });
}

function main() {
    var n = input("Number: ");
//    console.log("value: " + n);    // problematic line
}

main();
我想模仿Python的
原始输入
,即从用户那里读取一行代码。显示提示后,应阻止程序,直到用户按Enter键


如果“有问题的行”在注释中,则它可以工作,程序正在等待输入。但是,如果这一行不在注释中,则程序不会等待输入,
n
将变为
undefined
。为什么?如何编写返回用户输入的函数?

这是因为您希望在调用return之前执行输入,而这不是它的工作方式。有问题的路线确实是前一条路线。首先,输入不返回任何内容,return语句是问题回调函数的返回,但随后,您似乎误解了执行流程,正如我们在某个点上所做的那样(在出现一些像这样的死胡同之后,您会很快得到它)

  • 您的脚本已加载
  • 您可以声明和定义rl、input和main
  • 主要执行
  • 您将n定义为输入的结果 这就是事情开始变得异步有趣的地方
  • 由于问题是异步的,所以它的执行会启动,但不会阻止进程
  • 输入返回未定义(当您仍在等待输入时)
  • 你打印的是未定义的
  • 你在输入上写了一些东西
  • question()完成其执行并调用回调(作为第二个参数提供的函数)
  • rl关闭
  • 回调函数返回该行,它被void吞没(这不是技术术语,只是一个隐喻)
  • 您可能希望这样做:

    #!/usr/bin/env node
    
    "use strict";
    
    var readline = require('readline');
    
    var rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    
    function input(prompt, callback) {
        rl.question(prompt, function (x) {
            rl.close();
            callback(x);
        });
    }
    
    function main() {
        var n = input("Number: ", console.log);
    }
    
    main();
    

    如果您不熟悉javascript和node,您可能会发现使用它非常有用,如果您有时间、金钱和机会,请阅读Brad Dayley的文章。

    谢谢,但是以后如何使用
    n
    呢?例如,如果我将这一行添加到
    main()
    console.log(编号(n)+1)的末尾,那么它又有问题了。或者,如果我想读取两个数字并添加
    n1
    n2
    ,然后在
    main
    中打印结果。是的,我是新手,谢谢你提供的有用链接。以后你想做的任何事情都必须在回调中完成。不要传递console.log,而是在接下来的操作中传递一个自定义函数。例如,如果传递main本身,您将得到一个漂亮的parrot提示,重复您的输入并再次询问。如果你用输入传递一个函数来进行系统调用,然后调用main,你会得到一个shell,依此类推……如果你把那一行添加到main中,你试图从undefined中生成一个数字,这是你从输入中得到的结果(它不返回任何东西),我想这会给你NaN,但不管怎样,布拉德·戴利的联系被打破了。在亚马逊。