【发布时间】:2013-10-06 14:39:17
【问题描述】:
我在玩Q 和promptly,我试图按顺序要求用户输入一些东西。例如:
What is your name? Bob
What is your age? 40
Hello Bob (40)!
(是的!这是一个简单的“Hello world!”程序。)
这是我正在尝试的代码,直接来自 Q 的 github 项目页面:
Q.fcall(promptly.prompt, "What is your name? ")
.then(promptly.prompt, "What is your age? ")
.done(function(name, age) {
console.log("Hello " + name + " (" + age + ")");
});
});
但它没有按预期工作(也许我读错了?)。无论我尝试什么,似乎promptly.prompt 正在并行侦听击键,并且立即调用.done 函数,导致
/path/to/node_modules/promptly/index.js:80
fn(null, data);
^
TypeError: undefined is not a function
at /path/to/node_modules/promptly/index.js:80:9
...
一旦我按下 Enter。知道为什么会这样做以及我如何才能完成我想做的事情吗?
** 编辑 **
基本上,我的最终目标是创建一个像这样调用的可重用函数:
promptAll({
'name': "What is your name? ",
'age': "What is your age? "
}).done(function(input) {
console.log(input); // ex: { name: "Bob", age: 40 }
});
** 更新**
这是我的工作解决方案,我必须按照WiredPraine 的建议使用nfcall:
function multiPrompt(args) {
function _next() {
if (keys.length) {
var key = keys.pop();
Q.nfcall(promptly.prompt, args[key]).done(function(value) {
result[key] = value;
_next();
});
} else {
def.resolve(result);
}
};
var def = Q.defer();
var keys = _.keys(args).reverse();
var result = {};
_next();
return def.promise;
};
(注意:我使用的是下划线,但同样可以使用标准的对象迭代器来实现。)
【问题讨论】: