这个例子有没有可能使用promise?
我基本上试图写一个非常基本的程序,将这样工作:
Enter your name: _ Enter your age: _ Your name is <name> and your age is <age>.
我一直在试图找出如何在Node中做这样的事情,而不使用prompt
npm模块。
我的这个尝试是:
import readline from 'readline' const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) rl.question('What is your name? ', (name) => { rl.question('What is your age? ', (age) => { console.log(`Your name is ${name} and your age is ${age}`) }) })
然而,这样做的嵌套的方式似乎很奇怪,有没有我能做到这一点,而不是像这样嵌套得到正确的顺序?
zangw的回答就足够了,但是我想我可以更清楚一些:
import readline from 'readline' const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) function askName() { return new Promise((resolve) => { rl.question('What is your name? ', (name) => { resolve(name) }) }) } function askAge(name) { return new Promise((resolve) => { rl.question('What is your age? ', (age) => { resolve([name, age]) }) }) } function outputEverything([name, age]) { console.log(`Your name is ${name} and your age is ${age}`) } askName().then(askAge).then(outputEverything)
如果你不关心这个问题,你可以这样做:
//the other two stay the same, but we don't need the name or the arrays now function askAge() { return new Promise((resolve) => { rl.question('What is your age? ', (age) => { resolve(age) }) }) } Promise.all([askName, askAge]).then(outputEverything)
Q
是一个例子
var readline = require('readline'); var Q = require('q'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); var q1 = function () { var defer = Q.defer(); rl.question('What is your name? ', (name) => { defer.resolve(name); }); return defer.promise; }; q1().then(function(name) { rl.question('What is your age? ', (age) => { console.log(`Your name is ${name} and your age is ${age}`) }); });
还是用简单的Promise
function question1() { return new Promise(function(resolve) { rl.question('What is your name? ', (name) => { resolve(name); }); }); }; question1().then(function(name) { rl.question('What is your age? ', (age) => { console.log(`Your name is ${name} and your age is ${age}`) }); });
没有承诺就有办法做到这一点。
rl.question('What is your name? ', getUserName); function getUserName (name) { rl.question('What is your age? ', getUserAge(name)); } function getUserAge (name) { return function (age) { console.log(`Your name is ${name} and your age is ${age}`) } }
看,没有嵌套,但适当重构的function。 您可以并且应该对返回承诺的API做同样的事情。 匿名函数是该语言的一个很好的function,但这并不意味着你必须使用它的一切。