2016-05-21 18 views
1

Im Yeomanにとってはかなり新しいですが、再帰的なプロンプトを実現しようとしています。 jhipsterのEntityGenerator(https://github.com/jhipster/generator-jhipster/tree/master/generators/entity)に触発されました。Yeoman再帰的なプロンプト、コールバックは実行されません

しかし、ループの発生を防ぐどこかにエラーがあるようです。次のように

私のコードは次のとおりです。

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);は実行されません。そのようなプロンプトのコールバックのようなことは起こりません。ジェネレータは、1回の実行後にただ終了します。

私はすべての機能のthis -sをログに記録し、比較しました。それらは同じです。私は多くの同様のstackoverflowの質問を見てきましたが、それはdoesntの仕事を除いて何か間違って見ることができません。

ご意見やご感想はありがとうございます。

答えて

3

yeoman-generator v0.23.0以降を使用しているようです。ヨーマンジェネレータv0.23.0(https://github.com/yeoman/generator/releases/tag/v0.23.0)のリリースによる

ベース#プロンプト()関数は、現在代わり コールバックパラメータを取る約束を返します。そうすれば、非同期のタスクである のタスクを使いやすくすることができます。

prompting: function() { 
    return this.prompt(questions).then(function (answers) { 
    this.answers = answers; 
    }.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()を要求する代わりに戻り値 として約束しています。

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

    によって:あなたの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)); 

あなたはにそれをやったとして、あなたのaskForデータ()関数:

return this.prompt(prompts).then(function (props) { 
    this.props = props; 
    this.async(); 
}.bind(this)); 
+0

私の遅い返事で申し訳ありませんが、私は立ち往生してからしばらくの間、氷上でプロジェクトをしていました。とにかく、ソリューションは完璧に働いた、ありがとう! – lassejl

関連する問題