用户输入node.js

Jab*_*bba 5 input raw-input node.js

我有以下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();
Run Code Online (Sandbox Code Playgroud)

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

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

Lui*_*ira 3

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

  1. 您的脚本已加载
  2. 您声明并定义 rl、input 和 main
  3. 主要执行
  4. 你将 n 定义为输入的结果 这就是事情开始变得异步有趣的地方
  5. 由于问题是异步的,因此它的执行开始但不会阻止进程
  6. 输入返回未定义(当您仍在等待输入时)
  7. 你打印未定义的
  8. 你在输入上写一些东西
  9. Question() 完成执行并调用回调(您作为第二个参数提供的函数)
  10. RL已关闭
  11. 回调函数返回该行,并被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();
Run Code Online (Sandbox Code Playgroud)

如果您是 javascript 和 Node 的新手,您可能会发现使用learnyounodeNode 代码学校路径非常有用,甚至,如果您有时间、金钱和机会,请阅读Node.js、MongoDB 和 AngularJS Web 开发,布拉德·戴利着。