我正在使用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(函数)里面我调用了回调,所以那就是金色。
任何人都知道为什么这可能无法正常执行?
最终结果是并行处理每个函数调用,然后在完成后通知我,我可以继续执行其他一些指令。
谢谢!
答案 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
});