用户输入node.js

时间:2015-11-07 15:15:08

标签: 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) {
        rl.close();

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

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

main();

我想模仿Python的raw_input,即从用户那里读取一行。显示提示后,应阻止程序,直到用户按Enter键。

如果"有问题的行"在评论,它的工作,程序正在等待输入。但是,如果此行不在评论中,则程序不会等待输入,n变为undefined。为什么?如何编写一个返回用户输入的函数?

1 个答案:

答案 0 :(得分:3)

那是因为你期望执行输入等待直到调用return,这不是它的工作方式。有问题的一行确实是前一行。首先,输入不返回任何内容,return语句是问题回调函数的返回,但是,你似乎误解了执行流程,因为我们在某些时候都有这种情况(你会在一些事情之后很快得到它)像这样的死胡同)

  1. 您的脚本已加载
  2. 您声明并定义rl,input和main
  3. 主要执行
  4. 您将n定义为输入的结果 这里的事情开始变得非常有趣
    1. 因为问题是异步的,所以它的执行开始但不会阻止进程
    2. 输入返回undefined(当您还在等待输入时)
    3. 你打印未定义的
    4. 你在输入上写了一些东西
    5. question()完​​成执行并调用回调(您给出的函数作为第二个参数)
    6. rl已关闭
    7. 回调函数返回该行,它被void吞没(这不是技术术语,只是一个比喻)
  5. 你可能想这样做:

    #!/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和节点的新手,您可能会发现使用learnyounodenode code school path非常有用,甚至,如果您有时间,金钱和机会,请阅读Node.js, MongoDB, and AngularJS Web Development,布拉德戴利。