提前感谢您看一下。
我在一个无效的循环中有一个异步任务。我已经确定:
此功能输出......没有!?由于某种原因,grunt.log.writeln语句甚至没有触发。任务完成且没有错误。我还尝试添加一个20秒的延迟,以防脚本在异步任务返回之前完成。奇怪的是,如果我不调用“done(error)”,文件将写入文件(当我用grunt.file.write语句替换writeln时)。
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
答案 0 :(得分:13)
done()
,这意味着所有exec()
方法都运行了它们的回调。目前,您正在每次迭代时执行done
回调。您可以使用grunt附带的节点模块async中的forEach
方法轻松实现此目的(grunt.util.async
(或forEachSeries
,如果您需要exec()
按顺序执行的方法。
像这样(未经测试):
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);
});