1

我有一系列邮政编码,如下所示:

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() 的情况下,如何确保所有地址都填写在位置中?

4

1 回答 1

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 
});
于 2013-03-06T19:56:55.223 回答