是否可以在此示例中使用承诺
Is it possible to use promises for this example?
我基本上是在尝试编写一个非常基本的程序,它将像这样工作:
Enter your name: _
Enter your age: _
Your name is <name> and your age is <age>.
我一直在尝试弄清楚如何在不使用 prompt
npm 模块的情况下在 Node 中做这样的事情。
我对此的尝试是:
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}`)
}
}
看,没有嵌套,但正确重构了函数。您可以并且应该对返回承诺的 API 执行相同的操作。匿名函数是该语言的一个很好的功能,但这并不意味着您必须将其用于所有事情。
相关文章:
- 如何判断请求/承诺是否需要超过5秒才能完成,angular js
- 是否可以将已解析的承诺分配给对象的属性
- 是否可以覆盖本机 Es6 承诺解析方法
- jQuery 承诺是否符合 Promises/A+
- 是否有可能将承诺的结果作为论据传递给 IIFE
- 我的承诺是否按预期工作
- 如何检查对象是否为承诺
- 我可以创建一个承诺来检查变量是否设置为角度吗?
- 是否可以覆盖本机获取 API 以使用所需的承诺库而不是本机浏览器承诺
- 我是否可以假设承诺中的错误会冒泡到新的承诺并抓住它
- 承诺.resolve 是否等待传递的承诺实现
- 无论承诺是否履行,如何执行相同的操作
- 扩展函数(如 .all()、.final() 等是否有承诺标准?
- UI 路由器:是否可以解析子状态中的父承诺
- 在 Nodejs 中使用 Jasmine 测试承诺是否被解析或拒绝
- 是否可以在此示例中使用承诺
- Node sequelize回调承诺期望一个函数,是否有一种方法可以通过函数调用删除已声明的函数
- 承诺是否能及时成为条件句的一部分?
- jQuery承诺:是否有可重复使用的替代方案
- 承诺是否异步或同步解决