【问题标题】:yeoman generator prompts and run loopyeoman 生成器提示和运行循环
【发布时间】:2016-11-08 07:39:41
【问题描述】:

我的生成器代码如下。当我运行它时,我看到了一些有趣的行为。一旦它询问第二个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
};

【问题讨论】:

    标签: yeoman-generator yo


    【解决方案1】:

    看起来您正在与 Yeoman 对象语法作斗争。您没有将承诺返回给提示方法(您正在返回一个带有返回承诺的 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;
    }
    

    在您的具体情况下,您已经正确设置了 Promise,但您没有将其返回到提示属性(仅返回到 askForProperties 属性)。

    由于askForProperties 已经返回承诺,您的解决方法是:

    prompting: questions.askForProperties
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2017-08-01
      • 2015-06-26
      • 2014-05-19
      相关资源
      最近更新 更多