MongooseJS:使用数组元素作为查询获取记录并使用回调不起作用

时间:2013-03-06 19:33:44

标签: mongoose

我有一个像这样的邮政编码:

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()的情况下访问之前,如何确保所有地址都填充在某些位置?

1 个答案:

答案 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 
});