异步并行重复条目
Async Parallel duplicate entries
所以我要遍历一个名为 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 循环与异步调用混合使用是一个常见的错误。你需要关闭i,否则它会被变异。
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)
};
所以我要遍历一个名为 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 循环与异步调用混合使用是一个常见的错误。你需要关闭i,否则它会被变异。
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)
};