如何让 JavaScript 控制台用户输入正常工作 (node.js)?
How to get JavaScript console user input working (node.js)?
这是我的一些作业。我希望它读取用户输入,然后创建两个对象,根据用户输入为它们赋值。这是我的代码,从 JS 文件的顶部开始:
console.log("Type 'help' for commands");
console.log("Square numbers:");
console.log("Enter player 1 name");
var player1 = new Player(readLine());
var player2 = new Player(readLine());
console.log("logging name after making players" + player1.name);
function readLine() {
var inputText;
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Enter player name? ", function(answer) {
inputText = answer;
console.log("Player name:", answer);
rl.pause();
});
return inputText;
}
这是我得到的输出:http://oi60.tinypic.com/9tn7nn.jpg
我习惯了 C# 和 Java,在这些语言中,readline() 会等待输入,然后用我输入的任何内容创建对象,然后再转到下一行。虽然不是在 JS 中!它只是继续,在我输入任何内容之前调用 readline() 两次(因此打印 "prompt>" 两次)然后记录播放器 1 的名称(在输入之前,因此未定义)。然后它等待我输入一些东西,一旦我输入一些东西,它就会将两个玩家设置为同一个名字,然后结束程序。
是否可以做我想让它做的事情?有没有另一种方法可以让输入工作而不会跳过它和 运行 其余代码?
提前致谢!
您对 JavaScript 做出了几个错误的假设。主要问题是 rl.question(...)
向用户显示提示,但它无法阻止 JS 线程本身,因此您的 readline()
函数将立即退出 undefined
因为 function(answer)
还没有 运行 因为用户还没有输入任何内容。构建代码的一种简单方法是:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write("Type 'help' for commands\n");
rl.write("Square numbers:\n");
function createPayer(number, callback){
rl.question("Enter player " + number + " name? ", function(answer) {
var player = new Player(answer);
// Call the callback function once the player is created.
callback(player);
});
}
createPayer(1, function(player1){
createPayer(2, function(player2){
console.log("logging name after making players" + player1.name);
console.log("logging name after making players" + player2.name);
// Then call player logic you have from in here.
});
});
关键是这里没有明确的 'wait'。 JS 代码主要是基于事件和回调的,因此您不必等待用户输入内容,而是排队等待他们输入内容后调用的函数。
这是我的一些作业。我希望它读取用户输入,然后创建两个对象,根据用户输入为它们赋值。这是我的代码,从 JS 文件的顶部开始:
console.log("Type 'help' for commands");
console.log("Square numbers:");
console.log("Enter player 1 name");
var player1 = new Player(readLine());
var player2 = new Player(readLine());
console.log("logging name after making players" + player1.name);
function readLine() {
var inputText;
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Enter player name? ", function(answer) {
inputText = answer;
console.log("Player name:", answer);
rl.pause();
});
return inputText;
}
这是我得到的输出:http://oi60.tinypic.com/9tn7nn.jpg
我习惯了 C# 和 Java,在这些语言中,readline() 会等待输入,然后用我输入的任何内容创建对象,然后再转到下一行。虽然不是在 JS 中!它只是继续,在我输入任何内容之前调用 readline() 两次(因此打印 "prompt>" 两次)然后记录播放器 1 的名称(在输入之前,因此未定义)。然后它等待我输入一些东西,一旦我输入一些东西,它就会将两个玩家设置为同一个名字,然后结束程序。
是否可以做我想让它做的事情?有没有另一种方法可以让输入工作而不会跳过它和 运行 其余代码?
提前致谢!
您对 JavaScript 做出了几个错误的假设。主要问题是 rl.question(...)
向用户显示提示,但它无法阻止 JS 线程本身,因此您的 readline()
函数将立即退出 undefined
因为 function(answer)
还没有 运行 因为用户还没有输入任何内容。构建代码的一种简单方法是:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write("Type 'help' for commands\n");
rl.write("Square numbers:\n");
function createPayer(number, callback){
rl.question("Enter player " + number + " name? ", function(answer) {
var player = new Player(answer);
// Call the callback function once the player is created.
callback(player);
});
}
createPayer(1, function(player1){
createPayer(2, function(player2){
console.log("logging name after making players" + player1.name);
console.log("logging name after making players" + player2.name);
// Then call player logic you have from in here.
});
});
关键是这里没有明确的 'wait'。 JS 代码主要是基于事件和回调的,因此您不必等待用户输入内容,而是排队等待他们输入内容后调用的函数。