Node.js 如何在Grunt自定义任务中处理多个异步请求?
我正在进行一项grunt任务,该任务从wordpress svn repo安装最新的wordpress插件,这是通过命令行任务完成的 理想情况下,我希望这是同步完成的,这样我就可以看到每个插件安装时的输出(通过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', '
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);
});
});