这个例子有没有可能使用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,但这并不意味着你必须使用它的一切。