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