自耕农生成器提示并运行循环



我的生成器代码如下所示。当我运行它时,我看到了一些有趣的行为。一旦它请求第二个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对象语法作斗争。你没有将承诺返回给提示方法(你返回的是一个带有askForProperties方法的对象,该方法返回一个承诺)

对于任何正在研究这个的人来说,它是在Yeoman文档运行上下文下的标题为异步任务的部分

prompting() {
    const done = this.async();
    this.prompt(prompts).then((answers) => {
        this.log('My work after prompting');
        done();
    });
}

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

然而,你真正想做的是从prompting()方法本身返回一个承诺。

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

在你的特定情况下,你已经正确设置了承诺,但你没有将它返回给提示属性(只是返回给askForProperties属性)。

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

prompting: questions.askForProperties

相关内容

  • 没有找到相关文章

最新更新