9

提前感谢您查看此内容。

我在一个不起作用的循环中有一个异步任务。我已确保:

  1. 将我的循环变量“key”包装在一个闭包中以避免经典的“仅最后一个值”问题,其中循环在异步任务返回值之前很久就完成了,并且只显示最后一个值。
  2. 调用 done(error) 来完成我的异步任务(根据 Gruntjs FAQ)
  3. 使用 hasOwnProperty() 确保键是对象的实际属性,而不是来自原型。
  4. 遵循 node.exec 示例的格式,除了将 exec 的值分配给一个变量——我试过了,但没有帮助。请参阅下面的第一个参考。

这个函数输出......什么都没有!?由于某种原因, 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

4

1 回答 1

13

done()应该只在整个操作完成时调用,这意味着当所有exec()方法都运行了它们的回调时。目前,您正在done每次迭代中执行回调。您可以通过使用grunt ( ( 附带forEach的节点模块asyncgrunt.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);
});
于 2013-01-20T21:19:22.480 回答