Yeoman генератор работает asyn c лучшие практики - PullRequest
4 голосов
/ 16 апреля 2020

Я создаю генератор yeoman, который работает нормально, теперь мне нужно добавить список из вызова asyn c (я хочу, чтобы он работал в фоновом режиме), который может занять около 2-3 сек c для извлечения данных поэтому я положил его внутрь initializing, поскольку пользователь получит этот вопрос в качестве третьего вопроса. (см. объект ниже), поэтому процесс извлечения данных начнет избегать ожидания, когда пользователь нажмет на вопрос 3. В основном я хочу, чтобы извлечение данных было выполнено в фоновом режиме.

Мой вопрос:

  1. Являются ли они асин c использование обрабатывается нормально? Я имею в виду запуск asyn c в методе initialize

Я попробовал следующее:


export default class AppGenerator extends Generator {
    private listData: ListInstance[];


    async initializing() {
        this.props = {
            appName: "app",
            apiName: "app-api",
        };
        //--------------Here I call to async function --------------//
        this.listData = await GetInstances();
    }

    async prompting() {
        const answers = await this.prompt([
            {
                name: "appName",
                message: "Project name: ",
                type: "input",
                default: this.props.appName,

            },
            {
                name: "apiName",
                message: "API name: ",
                type: "input",
                default: this.props.apiName,
            },
            {
                name: "instanceName",
                type: "list",
                message: "Choose instance",
                choices: this.listData,
            },
        ];
    }

writing() {

//here I dont get the `this.answers` , I need to get the values from the answers

} 

1 Ответ

0 голосов
/ 23 апреля 2020

Первые некоторые наблюдения:

  • Yeoman Uses Inquirer. js 1
  • Inquirer. js имеет реактивный запрос 2
  • наконец, я не проверял этот код. Пожалуйста, извините или укажите на ошибки

, также убедитесь, что ваши ответы доступны вне метода Prompting (то есть, используя this для класса - используется в примере)

...
    async prompting() {
        var prompts = new Rx.Subject();
        this.prompt(prompts);
        prompts.next({
            name: "appName",
            message: "Project name: ",
            type: "input",
            default: this.props.appName,
        });
        prompts.next({
            name: "apiName",
            message: "API name: ",
            type: "input",
            default: this.props.apiName,

        });
        this.listData = await GetInstances();
        prompts.next({

            name: "instanceName",
            type: "list",
            message: "Choose instance",
            choices: this.listData,

        });
        prompts.complete();
        this.answers = this.prompt(prompts).ui.process.subscribe(onEachAnswer, onError, onComplete);
    }
...

Другие примечания: использование await вызовет GetInstances, когда начнется раздел Prompting. Однако он не позволит задать последний вопрос до тех пор, пока не вернется GetInstances.


1: Yeoman использует Inquirer. js

2: Реактивная подсказка в Inquirer. js

...