我发现很难解释或搜索这个问题,所以我要问Stack Overflow。
我多次要求用户在终端中输入用户信息并希望从中获取功能。一个带有问题和变量的函数,输入应该添加到变量中。
这是我的代码:
var name = 'hello',
age = '11'
var readline = require('readline');
// var rl = readline.createInterface(process.stdin, process.stdout);
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var getInput = function(inputVariable, question, cb) {
rl.question(question, function(answer) {
inputVariable = answer;
rl.close();
cb();
});
}
var askForName = function() {
console.log(1,age, name);
getInput(name, "What's your name? ", askForAge);
}
var askForAge = function() {
console.log(2,age, name);
getInput(age, "How old are you? ", printIt);
}
var printIt = function() {
console.log("Hello, " + name);
console.log(".. and " + age + " old.");
}
askForName();
谢谢!
答案 0 :(得分:1)
在node.js应用程序中,通常使用回调链或promises来解决这个问题。
使用回调,您可以像这样编写代码:
var getInput = function(question, cb) {
rl.question(question, function(answer) {
// Don't set the variable, but return value to callback
rl.close();
cb(answer);
});
}
// ask* take a callback which they call with the value
var askForName = function(cb) {
getInput("What's your name? ", cb);
}
var askForAge = function(cb) {
getInput("How old are you? ", cb);
}
// printIt takes the values as parameters
var printIt = function(name, age) {
console.log("Hello, " + name);
console.log(".. and " + age + " old.");
}
// Now ask for name and age and store them as local variables
// inside callbacks
askForName(function(name) {
askForAge(function(age) {
printIt(name, age);
});
});
我添加了评论来解释这些变化。基本上,值只在回调之间传递,从不暴露给另一个范围。
答案 1 :(得分:1)
将变量传递给函数时,将引用更改为它不会影响原始变量。您可以修改变量的属性。但是,这不应该被用作传递变量的主要方法。
从异步进程传递响应的常用方法是使用回调函数。你几乎得到了它:
var getInput = function( question, cb ) {
rl.question(question, function(answer) {
rl.close();
cb(answer);
});
}
var askForName = function( cb ) {
getInput("What's your name? ", cb);
}
var askForAge = function( cb ) {
getInput("How old are you? ", cb);
}
var printIt = function( name, age ) {
console.log("Hello, " + name);
console.log(".. and " + age + " old.");
}
askForName(function(name) {
askForAge(function(age) {
printIt( name, age );
});
});
答案 2 :(得分:1)
在javascript中,只有reference
传递了某些内容 - 它们是objects
和arrays
。所有其他原始类型(字符串,整数等)都不是。
说到这里,有很多方法可以让你在这里得到你的东西..特别是因为age
和name
基本上是globals
(至少在目前的事情范围)
一种方法是只需要getInput()
方法return
所需的值,然后将其分配给global
var。另一种方法是为您想要更改的每个setter
编写global
个方法。还有其他人,但那些是最简单的......
无论如何,以下内容可以解决您的问题:
var name = 'hello',
age = '11'
var readline = require('readline');
// var rl = readline.createInterface(process.stdin, process.stdout);
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var getInput = function(inputVariable, question, cb) {
rl.question(question, function(answer) {
if( inputVariable === 'name' ) {
name = answer;
} else if( inputVariable === 'age' ){
age = answer;
}
rl.close();
cb();
});
}
var askForName = function() {
console.log(1,age, name);
getInput('name', "What's your name? ", askForAge);
}
var askForAge = function() {
console.log(2,age, name);
getInput('age', "How old are you? ", printIt);
}
var printIt = function() {
console.log("Hello, " + name);
console.log(".. and " + age + " old.");
}
askForName();
现在,有更优雅的方式来做到这一点。例如,您可以创建map
,您可以将if语句更改为switch
,您可以getInput
通过callback
等返回字符串。
答案 3 :(得分:1)
您可以使用Object
代替原始值,因为对象是通过引用传递的,这意味着原始对象的内存地址将受到影响。
在下面的示例中,通过利用对象中的该功能,我还使用了 Function.prototype.call()
方法来设置函数的执行上下文(在{{{ 1}}变量不是全局的。
answers