我有一个像这样的邮政编码:
zipCodes = [1234, 5678, 1357, 2468];
现在,我需要根据这些邮政编码获取位置。我这样做:
locations = [];
zipCodes.forEach(function(zip) {
Addresses.findOne({ zipCode: zip }, function(error, address) {
//assuming it is a success
locations.push(address);
}
});
//data which works on locations
问题是在位置上工作的数据(最后)没有所有地址 - 至少在访问时是这样。如果我延迟5-10秒(在zipCodes.forEach()之后使用setTimeOut),则位置包含所有地址。
我怀疑的原因是push()
进入的位置是异步发生的,而不是最终访问位置的时间。
在不使用setTimeOut()的情况下访问之前,如何确保所有地址都填充在某些位置?
答案 0 :(得分:1)
你的预感是正确的; findOne
回调以异步方式发生,因此您必须等到它们完成后再处理locations
。
处理此问题的一种方法是使用流程控制库,如async。
locations = [];
async.each(zipCodes, function(zip, callback) {
Addresses.findOne({ zipCode: zip }, function(error, address) {
//assuming it is a success
locations.push(address);
callback();
});
}, function (err) {
//data which works on locations
});