异步运行脚本

时间:2018-10-24 11:27:18

标签: javascript asynchronous command-line-interface yeoman

我正在Yeoman generator进行安装,安装了CraftCMS并预先加载了一些自定义设置和文件,以加快开发速度。

我要指出脚本执行composer create-project craftcms/craft的位置。对我来说,下一个合乎逻辑的步骤是将cd放入文件夹并运行工艺安装程序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 :(得分:0)

问题在于spawnCommand本质上是异步的,它无法为您提供任何等待命令完成的方法。它不需要回调参数,也不会返回promise。

但是,还有另一个命令:spawnCommandSync,该命令保证同步进行工作。试试看。