我试图弄清楚如何使用promises使用yeoman生成器进行递归提示。我正在尝试生成一个表单生成器,它首先要求表单组件的名称,然后为每个输入请求一个名称(将用作id)(即:firstName,lastName,username等)。我已经使用回调找到了这个问题的答案,但我想坚持承诺。下面是我到目前为止的代码以及我试图为递归做的但是没有工作。感谢您的任何帮助和建议!
const Generator = require('yeoman-generator')
const questions = [
{ type: 'input',
name: 'name',
message: 'What is the name of this form?',
default: 'someForm'
},
{
type: 'input',
name: 'input',
message: 'What is the name of the input?'
},
{
type: 'confirm',
name: 'askAgain',
message: 'Is there another input to add?'
}
]
module.exports = class extends Generator {
prompting() {
return this.prompt(questions).then((answers) => {
if (answers.askAgain) {
this.prompting()
}
this.userOptions = answers
this.log(this.userOptions)
})
}
}
答案 0 :(得分:2)
对于任何偶然发现这篇文章寻找答案的人来说,这就是我最终要做的事情。正如你在我的Form类中看到的扩展Generator我在那里有一个名为prompting()的方法。这是Yeoman循环识别的优先级方法,并且在返回某些内容之前不会保留此方法。由于我正在回复一个承诺,它将等到我的承诺完成后继续前进。对于我的第一个提示,这正是我需要的,但是对于第二个提示,在提示2中你可以添加
const done = this.async()
在您的方法开始时。这告诉yeoman你将发生一些异步代码,而不是移动到包含它的方法,直到执行完成。如果你不使用它并在你的类后面有另一个优先级方法,比如当你准备好生成你生成的代码时写(),那么yeoman将超越你的方法,而不必等待你的异步代码完成。你可以在我的方法prompting2()中看到,每当用户声明有另一个输入名称时我会递归调用它,并且它会继续这样做,直到他们说没有其他输入来命名。我确信有更好的方法可以做到这一点,但这对我来说非常有用。我希望这有助于任何正在寻找方法的人!
const Generator = require('yeoman-generator')
const questions = [
{ type: 'input',
name: 'name',
message: 'What is the name of this form?',
default: 'someForm'
}
]
const names = [
{
type: 'input',
name: 'inputs',
message: 'What is the name of the input?',
default: '.input'
},
{
type: 'confirm',
name: 'another',
message: "Is there another input?",
default: true
}
]
const inputs = []
class Form extends Generator {
prompting() {
return this.prompt(questions).then((answers) => {
this.formName = answers.name
this.log(this.formName)
})
}
prompting2 () {
const done = this.async()
return this.prompt(names).then((answers) => {
inputs.push(answers.inputs)
if (answers.another) this.prompting2()
else {
this.inputs = inputs
this.log(this.inputs)
done()
}
})
}
}
module.exports = Form