我对Yeoman很新,但我试图完成一个递归提示。受到jhipster(https://github.com/jhipster/generator-jhipster/tree/master/generators/entity)中的EntityGenerator的启发。
然而,似乎在某个地方出现了阻止循环发生的错误。
我的代码如下:
var yeoman = require('yeoman-generator');
var inputFields = [];
module.exports = yeoman.Base.extend({
prompting: {
askForName: askForName,
askForFields: askForFields
}
});
function askForData() {
var prompts = [{
type: 'input',
name: 'name',
message: 'Name?',
default: 'Slim Shady'
}];
return this.prompt(prompts).then(function (props) {
this.props = props;
this.async();
}.bind(this));
}
function askForFields() {
var cb = this.async();
askForField.call(this, cb);
}
function askForField(cb) {
var prompts = [{
type: 'confirm',
name: 'fieldAdd',
message: 'Do you want to add a field?',
default: true
}, {
when: function (response) {
return response.fieldAdd === true;
},
type: 'input',
name: 'fieldName',
message: 'What is the name of your field?'
};
this.prompt(prompts, function (props) {
this.log("Done prompting: ", props);
if (props.fieldAdd) {
var field = {
fieldName: props.fieldName,
};
inputFields.push(field);
}
if (props.fieldAdd) {
askForField.call(that, cb);
} else {
cb();
}
}.bind(this));
}
递归提示的第一个循环正在按预期工作,但日志this.log("Done prompting: ", props);
永远不会执行。它就像提示的回调永远不会发生。一次运行后,发电机就会退出。
我已经记录并比较了所有函数的this
- s,它们是相同的。我已经看过许多类似的stackoverflow问题,但我看不出有什么问题,只是它不起作用。
感谢任何帮助或提示!
答案 0 :(得分:4)
看起来你正在使用yeoman-generator v0.23.0及以上。
根据yeoman-generator v0.23.0(https://github.com/yeoman/generator/releases/tag/v0.23.0)的发布:
Base#prompt()函数现在返回一个promise而不是一个 回调参数。这样可以更容易地在异步内部使用 任务。
this.prompt(prompts, function (props) {
this.log("Done prompting: ", props);
if (props.fieldAdd) {
var field = {
fieldName: props.fieldName,
};
inputFields.push(field);
}
if (props.fieldAdd) {
askForField.call(that, cb);
} else {
cb();
}
}.bind(this));
这是由于Inquirer.js v1.0.0(https://github.com/SBoudrias/Inquirer.js/releases/tag/v1.0.0)的发布:
整个查询者API现在基于承诺!
基本API接口现在是inquirer.prompt(questions).then()。 没有更多的回调功能。
任何异步问题函数都将承诺作为返回值 而不是要求this.async()。
在你的askForField()函数中,你必须替换:
return this.prompt(prompts).then(function (props) {
this.log("Done prompting: ", props);
if (props.fieldAdd) {
var field = {
fieldName: props.fieldName,
};
inputFields.push(field);
}
if (props.fieldAdd) {
askForField.call(that, cb);
} else {
cb();
}
}.bind(this));
由:
return this.prompt(prompts).then(function (props) {
this.props = props;
this.async();
}.bind(this));
正如你在askForData()函数中所做的那样:
if