Как сделать рекурсивный запрос в Йомане с обещаниями?
Я пытаюсь понять, как сделать рекурсивное приглашение с помощью генератора обещаний. Я пытаюсь создать генератор форм, который сначала запросит имя для компонента формы, а затем запросит имя (которое будет использоваться в качестве идентификатора) для каждого ввода (т. Е. 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)
})
}
}
1 ответ
Для тех, кто наткнулся на этот пост в поисках ответа, я должен был сделать это, чтобы он заработал. Как вы можете видеть в моем классе Form, который расширяет Generator, у меня есть метод prompting(). Это метод, распознаваемый циклом Йомана в качестве приоритета, и он не покинет этот метод, пока что-то не будет возвращено. Так как я возвращаю обещание, оно будет ждать, пока мое обещание не закончится, прежде чем двигаться дальше. Для моего первого приглашения это именно то, что мне нужно, но для второго, которое должно появиться в prompting2, вы можете добавить
const done = this.async()
в начале вашего метода. Это говорит йомену, что у вас будет какой-то асинхронный код, и вы не будете двигаться дальше метода, содержащего это, до тех пор, пока не будет выполнено. Если вы не используете это и у вас есть другой приоритетный метод в вашем классе после него, такой как writing() для того, когда вы будете готовы сгенерировать сгенерированный код, то 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