asynchronous并行重复条目

因此,我正在浏览一个名为candidates的数组,并使用数组中的每个项目执行某些任务,然后将结果推送到Firebase candfb 。 代码如下:

  var candidates = json.stageCandidates.candidate; var list = []; for (var i = 0; i < 20; i++) { var candidate = []; var id = candidates[i].candidateId; async.parallel([ function(callback) { votesmart.getDetailedBio(id, function(err, json) { if (!err && json.bio != undefined) candidate.bio = json.bio; callback(); }); }, function(callback) { votesmart.getAddress(id, function(err, json) { if (!err && json.address != undefined) candidate.address = json.address.office[0]; callback(); }); }, function(callback) { votesmart.getRating(id, function(err, json) { if (!err && json.candidateRating != undefined) candidate.ratings = json.candidateRating; callback(); }); }, function(callback) { votesmart.getVotes(id, function(err, json) { if (!err && json.bills != undefined) candidate.votes = json.bills; callback(); }) }, function(callback) { votesmart.getStances(id, function(err, json) { if (!err && json.npat != undefined) candidate.stances = json.npat; callback(); }) } ], function() { candfb.push(candidate); // res.send(candidate); }) }; 

现在的问题是,即使有20个项目被推送(在循环中硬编码),有些项目是重复的,有些正在被跳过。 某些项目可能是独一无二的,而其他项目可能会将多达3份副本推送到Firebase。 我也检查和数组candidates没有重复。

我怀疑这可能是由于我使用async.parallel()但我不确定要改变什么使它工作。

试试这个,它应该解决你的问题。 将同步for循环与asynchronous调用混合时,这是一个常见的错误。 你需要closures我,否则会发生变异。

  var candidates = json.stageCandidates.candidate; var list = []; for (var i = 0; i < 20; i++) { (function(i){ var candidate = []; var id = candidates[i].candidateId; async.parallel([ function(callback) { votesmart.getDetailedBio(id, function(err, json) { if (!err && json.bio != undefined) candidate.bio = json.bio; callback(); }); }, function(callback) { votesmart.getAddress(id, function(err, json) { if (!err && json.address != undefined) candidate.address = json.address.office[0]; callback(); }); }, function(callback) { votesmart.getRating(id, function(err, json) { if (!err && json.candidateRating != undefined) candidate.ratings = json.candidateRating; callback(); }); }, function(callback) { votesmart.getVotes(id, function(err, json) { if (!err && json.bills != undefined) candidate.votes = json.bills; callback(); }) }, function(callback) { votesmart.getStances(id, function(err, json) { if (!err && json.npat != undefined) candidate.stances = json.npat; callback(); }) } ], function() { candfb.push(candidate); // res.send(candidate); }) })(i) };