如何使用promises在Yeoman中进行递归提示?

时间:2017-06-02 12:16:36

标签: javascript recursion yeoman yeoman-generator

我试图弄清楚如何使用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)
    })
  }

}

1 个答案:

答案 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