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

これを処理する 1 つの方法は、 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 に答える