2016-05-21 3 views
1

Im довольно новый для Йомен, но я пытаюсь выполнить рекурсивную подсказку. Вдохновленный EntityGenerator в jhipster (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); никогда не выполняется. Его вроде обратного вызова подсказки никогда не происходит. Генератор просто выходит после одного запуска.

Я зарегистрировал и сравнил this -s всех функций, и они одинаковы. Я просмотрел много похожих вопросов stackoverflow, но я не вижу ничего плохого, за исключением того, что он не работает.

Любая помощь или советы приветствуются!

ответ

3

Похоже, вы используете yoman-generator v0.23.0 и выше.

В соответствии с выпуском старшина-генератор v0.23.0 (https://github.com/yeoman/generator/releases/tag/v0.23.0):

Base приглашение #() функция теперь возвращает обещание вместо того, чтобы параметр с обратного вызова. Это упростит использование внутри асинхронных задач .

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 теперь запрашивает.проб (вопросы) .then(). Нет функции обратного вызова.

  • Любые функции асинхронного вопроса берут на себя обещание как возвращаемое значение вместо того, чтобы требовать this.async().


Решение

В вашей функции askForField(), вы должны заменить:

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

по:

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

Извините за мой последний ответ, у меня был проект на льду какое-то время, так как я застрял. В любом случае, решение отлично работает, спасибо большое! – lassejl