如何让 Grunt 等待一个任务完成后再运行另一个任务?

2023-11-22

这是我的咕噜文件output.

正如您在输出中看到的,存在一些与异步任务相关的问题:

  1. imagemin被叫到,下一个就直接出现了。这使得它的输出出现在任务的最后,相当混乱;
  2. build,这是一个自定义任务,is using var done = this.async()并打电话done()完成命令后;但是,只有当我单独运行该任务时,这才可以正常工作;与其他任务一起运行它也会使其异步运行;
  3. With build稍后运行,jasmine没有什么可测试的,因此毫无用处。

有办法解决这种行为吗?


我相信你的问题在于这个任务:

grunt.registerTask('prepare-dist', 'Creates folders needed for distribution', function() {
            var folders = ['dist/css/images', 'dist/imgs/icons'];
            for (var i in folders) {
                    var done = this.async();
                    grunt.util.spawn({ cmd: 'mkdir', args: ['-p', folders[i]] }, function(e, result) {
                            grunt.log.writeln('Folder created');
                            done();
                    });
            }
    });

如果你有多个文件夹,async() 和done() 都会被调用多次。异步被实现为一个简单的标志(true/false),并且意味着被调用一次。第一个 did() 调用允许运行任何后续任务。

有很多方法可以将调用移至 async 并完成循环。快速谷歌搜索类似的内容:nodejs how to callback when a series of async tasks are complete会给你一些额外的选择。几个快速(且肮脏)的例子:

// Using a stack
(function() {
    var work = ['1','2','3','4','5']


    function loop(job) {
        // Do some work here
        setTimeout(function() {
            console.log("work done");

            work.length ? loop(work.shift()) : done();
        }, 500);
    }

    loop(work.shift());

    function done() {
        console.log('all done');
    }
})();

-- or --

// Using a counter (in an object reference)
(function() {
    var counter = { num: 5 }

    function loop() {
        // Do some work here
        setTimeout(function() {
            --counter.num;

            console.log("work done");

            counter.num ? loop() : done();
        }, 500);
    }

    loop();

    function done() {
        console.log('all done');
    }
})();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Grunt 等待一个任务完成后再运行另一个任务? 的相关文章

随机推荐