用户inputnode.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(); 

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

如果“有问题的行”在注释中,它就起作用,程序正在等待input。 但是,如果这行不在注释中,那么程序不会等待input,并且n变得undefined 。 为什么? 如何编写一个返回用户input的函数?

这是因为你期待input的执行等待,直到返回被调用,这不是如何工作。 问题的线确实是前一个。 首先,input不返回任何东西,return语句是问题callback函数的返回值,但是,那么您似乎误解了执行stream程,正如我们在某个时刻所做的那样(在死机之后,像这样结束)

  1. 你的脚本被加载
  2. 你声明和定义rl,input和main
  3. 主执行
  4. 你定义n作为input的结果这里是事情开始变得asynchronous搞笑的地方
    1. 因为问题是asynchronous的,它是执行开始,但不阻止进程
    2. input返回未定义(当你还在等待input)
    3. 你打印那个undefined
    4. 你在input上写了一些东西
    5. question()完​​成它的执行并调用callback函数(作为第二个参数的函数)
    6. rl已closures
    7. callback函数返回该行,并被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的新手,可能会发现使用learnyounode和节点代码学校path非常有用,如果您有时间,金钱和机会,请阅读Node.js,MongoDB和AngularJS Web Development ,由Brad Dayley撰写。