Запуск сценария асинхронный - PullRequest
0 голосов
/ 24 октября 2018

Я делаю Yeoman generator для установки CraftCMS с некоторыми пользовательскими настройками и файлами, предварительно загруженными для ускорения разработки.

У меня есть точка, где скрипт выполняет composer create-project craftcms/craft.Для меня следующим логическим шагом было бы cd в папку и запустить мастер установки craft craft install.

Я просто не могу понять, как сделать так, чтобы строки кода работали синхронно.На данный момент он работает все одновременно, что, конечно, приведет к ошибкам.

Это мой код:

'use strict';
const generator = require('yeoman-generator');
const chalk = require('chalk');
const yosay = require('yosay');
let init;
module.exports = class extends generator {
    async initializing() {
        this.log(yosay(chalk.blue('Hey!') + '\n' + 'Welcome to the Visited Installer!' + '\n\n' + 'Let\'s start a project together!'));
        init = await this.prompt([{
            type: 'input',
            name: 'name',
            message: 'What is the name of your new project?',
        }]);
        this.log(yosay(chalk.blue(init.name) + ', Great!' + '\n\n' + 'Let\'s start by downloading the latest version of CraftCMS.'));
    }
    install() {
        this.spawnCommand('composer', ['create-project', 'craftcms/craft', init.name]);
        this.log(yosay(chalk.blue('Done!') + '\n\n' + 'The next step is installing CraftCMS, Don\'t worry, I\'ve got this!'));
        this.spawnCommand('cd', [init.name]);
        this.spawnCommand('craft', ['install']);
    }
};

Я попытался прочитать об асинхронном и синхронном программировании вJS, но из-за того, что я не являюсь носителем английского языка, и из-за того, что я не очень много работаю с JS (я в основном использую PHP), мне трудно понять логику, стоящую за этим.

Обновление : я изменил свой пост, перепутал асинхронность и синхронизацию в своей голове.Проблема остается в том, что все в моей функции install() работает одновременно: this.log не ждет, пока this.spawnCommand завершит загрузку и настройку файлов ..

1 Ответ

0 голосов
/ 24 октября 2018

Проблема в том, что spawnCommand изначально асинхронен и не предоставляет никаких средств ожидания, пока команда не завершится.Он не принимает аргумент обратного вызова и не возвращает обещание.

Однако есть другая команда: spawnCommandSync , которая обещает выполнять свою работу синхронно.Попробуйте.

...