Async.js并行回调未执行

时间:2012-09-09 18:44:21

标签: node.js async.js node-async

我正在使用parallel function in Async.js,由于某种原因,最后的回调没有被执行,我没有看到任何地方发生错误。

我正在动态创建一个传递给并行调用的函数数组:

// 'theFiles' is an array of files I'm working with in a code-generator style type of scenario
var callItems = [];
theFiles.forEach(function(currentFile) {

      var genFileFunc = generateFileFunc(destDir + "/" + currentFile, packageName, appName);

      callItems.push(genFileFunc(function(err, results) {
        if(err) {
          console.error("*** ERROR ***" + err);
        } else {
          console.log("Done: " + results);  
        }

      }));

    });

    async.parallel(callItems, function(err, results) {
      console.log(err);
      console.log(results);
      if(err) {
        console.error("**** ERROR ****");
      } else {
        console.log("***** ALL ITEMS HAVE BEEN CALLED WITHOUT ERROR ****");  
      }
    });

然后在外部函数中(在执行上面的forEach的函数之外),我有generateFileFunc()函数。

// Function that returns a function that works with a file (modifies it/etc). 
function generateFileFunc(file, packageName, appName) {
  return function(callback) {
    generateFile(file, packageName, appName, callback);
  }
}

我看了this SO post,它帮助我到达了我所在的位置。但是最后的回调没有被执行。然而,正在执行并行调用中的所有项目。在最底部的gnerateFile(函数)里面我调用了回调,所以那就是金色。

任何人都知道为什么这可能无法正常执行?

最终结果是并行处理每个函数调用,然后在完成后通知我,我可以继续执行其他一些指令。

谢谢!

3 个答案:

答案 0 :(得分:4)

从头开始逐行分析发生的事情:

var genFileFunc = generateFileFunc(...);

由于函数generateFileFunc返回函数,因此变量genFileFunc是以下函数

genFileFunc === function(callback) {
    generateFile( ... );
};

现在很明显,此函数返回(没有return语句)。显然, nothing 我理解JavaScript的内置undefined常量。特别是你有

genFileFunc(function(err, results) { ... } ) === undefined

这是调用它的结果。因此,您将undefined推送到callItems。难怪它不起作用。

很难说如何解决这个问题而不知道generateFile究竟做了什么,但无论如何我都会尝试。试着这样做:

callItems.push(genFileFunc);

因为您必须将函数推送到callItems,而不是函数的结果,即undefined

答案 1 :(得分:2)

好奇。

到目前为止最好的猜测:在generateFile,RETURN回调中,而不是调用它。

答案 2 :(得分:1)

您可以使用

达到既定目标
async.map(theFiles, function(file, done) {
  generateFile(destDir + "/" + file, packageName, appName, done);
}, function(err, res) {
  // do something with the error/results
});