Yeoman递归提示,回调不运行

时间:2016-05-21 21:20:11

标签: javascript node.js yeoman

我对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问题,但我看不出有什么问题,只是它不起作用。

感谢任何帮助或提示!

1 个答案:

答案 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