在gulp任务中执行多个异步操作?

时间:2018-12-06 21:27:02

标签: javascript asynchronous promise gulp

我有一个名为deploy的任务,可以使用wwwroot命令将文件复制到我的项目exec文件夹中:

function deploy() {
    exec('robocopy CSS wwwroot\CSS *.css', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
    });

    exec('robocopy CSS CSS *.css', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
    }).;

    exec('robocopy JS wwwroot\\JS *.map', function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
    });
// ...
}

这曾经可以工作,但是从Gulp 4.0开始,它给出了以下错误消息:Did you forget to signal async completion?

根据指南https://gulpjs.com/docs/en/getting-started/async-completion#signal-task-completion,所有推荐的解决方案似乎期望每个任务只有一个异步功能。

是否可以在同一任务中运行这些异步功能?

1 个答案:

答案 0 :(得分:0)

我通过将exec调用包装在Promise中来解决了这个问题,

function multiExec(cmds) {
     var promises = [];
     for(var cmd of cmds) {
         promises.push(new Promise((resolve, reject) => {
             exec(cmd, (stdout, stderr, err) => {
                 if(err){
                     reject(err);
                 } else {
                     resolve();
                 });
             });
         });
     }
     return new Promise.all(promises);
}

然后按原样使用:

function deploy() {
    return multiExec(['robocopy CSS wwwroot\CSS *.css'
                      'robocopy CSS CSS *.css',
                      'robocopy JS wwwroot\\JS *.map']);
}