2016-11-08 52 views
1

我有我的发电机代码如下。当我运行它时,我看到一些有趣的行为。一旦它询问第二个Add property...,它的呼叫代码writing。一旦提示完成,不应该运行?我究竟做错了什么?yeoman发电机提示和运行循环

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 
}; 

回答

0

看起来你正在争夺自耕农对象语法。你不是承诺返回提示方法

对于任何人寻找到这一点,是在章节的Yeoman docs Running Context(您正在使用askForProperties方法返回一个承诺返回一个对象)的题异步任务

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