yeoman发生器提示并运行循环

时间:2016-11-08 07:39:41

标签: yeoman-generator yo

我的生成器代码如下。当我运行它时,我看到了一些有趣的行为。一旦它询问第二个Add property...,它也会在writing下调用代码。一旦提示完成,是不是应该运行?我究竟做错了什么?

app/index.js

'use strict'
var generators = require('yeoman-generator');
var questions = require('./questions');

module.exports = generators.Base.extend({
   constructor: function () {
      generators.Base.apply(this, arguments);
      this.argument('name', { type: String, required: true });
   },

   initializing: function () {
      this.properties = [];
   },
   prompting: {
     askForProperties: questions.askForProperties
   },
   writing: function(){
     this.log("brewing your domain project");
   }
});

app/questions.js

'use strict'

var chalk = require('chalk');

function askForProperties() {
   var prompts = [
    {
        type: 'confirm',
        name: 'addProp',
        message: 'Add property to your model (just hit enter for YES)?',
        default: true
    },
    {
        type: 'input',
        name: 'propName',
        message: 'Give name to your property?',
        when: function (response) {
            return response.addProp;

        }
    },
    {
        type: 'list',
        name: 'propType',
        message: 'Pick a type for your property',
        choices: [
            {
                value: 'string',
                name: 'string',
            },
            {
                value: 'int',
                name: 'int'
            },
            {
                value: 'bool',
                name: 'bool'
            },
            {
                value: 'decimal',
                name: 'decimal'
            }],
        default: 0,
        when: function (response) {
            return response.addProp;

        }
    }
 ];

return this.prompt(prompts).then(function (answers) {
    var property = {
        propertyName: answers.propName,
        propertyType: answers.propType
    };

    this.properties.push(answers.propName);

    if (answers.addProp) {
        askForProperties.call(this);
    }
 }.bind(this));
}

module.exports = {
   askForProperties
};

1 个答案:

答案 0 :(得分:0)

看起来你正在与Yeoman对象语法作斗争。您没有将promise发送给提示方法(您将使用返回promise的askForProperties方法返回一个对象)

对于任何对此进行调查的人来说,它位于标题为异步任务

的部分下的Yeoman docs Running Context
prompting() {
    const done = this.async();
    this.prompt(prompts).then((answers) => {
        this.log('My work after prompting');
        done();
    });
}

这允许系统知道您的承诺何时返回,从而知道等待执行下一个优先级步骤。

但是,您真正想要做的是从prompting()方法本身返回一个承诺。

prompting() {
    const promise = this.prompt(prompts).then((answers) => {
        this.log('Handling responses to prompts');
    });
    return promise;
}

在您的特定情况下,您已正确设置了承诺,但您没有将其返回到提示属性(仅限于askForProperties属性)。

由于askForProperties已经返回了承诺,因此您的修复将是:

prompting: questions.askForProperties