Node.js 如何在Grunt自定义任务中处理多个异步请求?

Node.js 如何在Grunt自定义任务中处理多个异步请求?,node.js,gruntjs,Node.js,Gruntjs,我正在进行一项grunt任务,该任务从wordpress svn repo安装最新的wordpress插件,这是通过命令行任务完成的 理想情况下,我希望这是同步完成的,这样我就可以看到每个插件安装时的输出(通过svnco)。。但它看起来像是exec简单地执行,而不是等待,所以使用var done=this.async()和done(error)可以很好地处理单个异步操作,但在这种情况下不能处理多个操作。。。我错过了什么 grunt.registerTask('install-plugin', '

我正在进行一项grunt任务,该任务从wordpress svn repo安装最新的wordpress插件,这是通过命令行任务完成的

理想情况下,我希望这是同步完成的,这样我就可以看到每个插件安装时的输出(通过
svnco
)。。但它看起来像是
exec
简单地执行,而不是等待,所以使用
var done=this.async()
done(error)
可以很好地处理单个异步操作,但在这种情况下不能处理多个操作。。。我错过了什么

grunt.registerTask('install-plugin', 'Get latest versions of required plugins', function(p){
    var exec = require('child_process').exec;
    var plugins = p ? [p] : grunt.config.get('wp_plugins');
    var pattern = 'svn co http://plugins.svn.wordpress.org/%s/tags/$(curl -s http://plugins.svn.wordpress.org/%s/trunk/readme.txt | grep "Stable tag:" | sed -E "s/[Ss]table tag: *//")/ plugins/%s'
    var done = this.async();
    plugins.forEach(function(plugin) {
        // using split/join instead of util.format('foo%s', 'bar')
        var cmd = pattern.split("%s").join(plugin);
        exec(cmd, function (error, stdout, stderr) {
            grunt.log.writeln('Installing WordPress Plugin: "' + plugin + '"');
            grunt.log.writeln(stdout);
            done(error);
        });
    });
});

这里的问题是每次通过循环调用
done
(又称this.async()),但grunt不知道您有一个循环。您需要有自己的回调函数来跟踪所有异步操作何时完成,然后只调用grunt的this.async()一次


或者,在web上搜索“node exec synchronous”(节点执行同步)会找到很多方法来完成任务,如果这是您想要的。

您正在调用
done
,然后它就会收到标准输出消息。侦听事件以在实际完成时获得通知。。。大致如下:

    exec(cmd, function (error, stdout, stderr) {
        stdout.on('data', function(data){
          grunt.log.writeln('Installing WordPress Plugin: "' + plugin + '"');
          grunt.log.writeln(stdout);
          done();
        });

        stderr.on('data', function(err){
          done(err);
        });
    });