Как сделать рекурсивный запрос в Йомане с обещаниями?

Я пытаюсь понять, как сделать рекурсивное приглашение с помощью генератора обещаний. Я пытаюсь создать генератор форм, который сначала запросит имя для компонента формы, а затем запросит имя (которое будет использоваться в качестве идентификатора) для каждого ввода (т. Е. 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
Другие вопросы по тегам