2013-09-10 5 views
0

У меня есть находка внутри цикла:Mongoose найти со ссылкой на объект

for(var idx in items){ 
    var item = items[idx]; 

    Model.find({'_id': item.id}, function(err, matches){ 
      console.log(item); // Points to the last item in items instead of 
          // expected item, since find is asynchronous 
    }); 
} 

Как вы видите, так как находка является асинхронной я не могу получить твердую ссылку на item вар.

Я мог бы продолжить и вручную искать его снова в массиве items совпадающим объектом внутри обратного вызова, но это просто не похоже на эффективный подход.

Если бы какой-либо способ «прикрепить» объект к вызову, чтобы я мог вернуть его с обратным вызовом, который был бы потрясающим.

Любые идеи?

ответ

1

Что вам нужно - это замыкание, так как цикл, и item с ним, будет выполнен до вызова любого обратного вызова.

for(var idx in items){ 
    (function(item){ 
    Model.find({'_id': item.id}, function(err, matches){ 
     console.log(item); 
    }); 
    })(items[idx]); 
} 

Какой должна быть почти такой же, как и следующие (предполагающих элементов является массивом):

items.forEach(function(item){ 
    Model.find({'_id': item.id}, function(err, matches){ 
    console.log(item); 
    }); 
})(items[idx]); 
+0

Спасибо! Второй пример - именно то, что мне нужно. –

Смежные вопросы