节点Gruntasynchronous任务循环与闭合不起作用

预先感谢您看看这个。

我有一个循环中的asynchronous任务不工作。 我已经确定:

  1. 将我的循环variables“key”封装在闭包中,以避免经典的“仅限最后一个值”的问题,循环在asynchronous任务返回一个值之前完成很长时间,只显示最后一个值。
  2. 调用完成(错误)完成我的asynchronous任务(根据Gruntjs常见问题解答)
  3. 使用hasOwnProperty()来确保键是对象的实际属性,而不是来自原型。
  4. 遵循node.exec例子的格式,除了把exec的值赋给一个variables – 我试过了,但是没有帮助。 见下面的第一个参考。

这个函数输出…什么都没有! 出于某种原因,grunt.log.writeln语句甚至没有发射。 任务完成没有错误。 我还尝试添加20秒的延迟,以防脚本在asynchronous任务返回之前完成。 奇怪的是,如果我不叫“完成(错误),”文件被写入文件(当我用grunt.file.write语句replacewriteln的)。

var done = this.async(), exec = require('child_process').exec, myJSON = { "file1" : "C:/home/me/jquery.js", "file2 " : "C:/home/me/grunt.js", ... "fileN" : "C:/home/me/N.js" }, count; for (var key in myJSON) { if (myJSON.hasOwnProperty(key)) { (function (key) { exec( 'type "' + myJSON[key] + '"', function(error, stdout, stderr) { if (error) { grunt.log.writeln('!!! exec error: ' + error); } grunt.log.writeln('stdout: ' + stdout); grunt.log.writeln('stderr: ' + stderr); done(error); } ); })(key); count++; } } 

参考文献:

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback https://github.com/gruntjs/grunt/wiki/Frequently-Asked-Questions

done()只应在整个操作完成时调用,这意味着所有exec()方法都运行了它们的callback。 目前,您正在执行每次迭代donecallback。 你可以通过在节点模块asynchronous中使用forEach方法来轻松实现这一点,该方法带有grunt( grunt.util.async (或者forEachSeries如果你希望依次执行exec()方法exec()

像这样(未testing):

 var done = this.async(); var exec = require('child_process').exec; var async = grunt.util.async; // updated var myJSON = { "file1": "C:/home/me/jquery.js", "file2": "C:/home/me/grunt.js", ... "fileN": "C:/home/me/N.js" }; async.forEach(Object.keys(myJSON), function(el, cb) { exec('type "' + myJSON[el] + '"', function(error, stdout, stderr) { if (error) { grunt.warn('!!! exec error: ' + error) return cb(error); } grunt.log.writeln('stdout: ' + stdout); grunt.log.writeln('stderr: ' + stderr); cb(); } ); }, function(error) { done(!error); });