0

我在循环中有一个发现:

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

如您所见,由于 find 是异步的,我无法获得对itemvar 的可靠引用。

我可以继续items通过回调中的匹配对象在数组中再次手动查找它,但这似乎不是一种有效的方法。

如果有任何方法可以将对象“附加”到调用中,那么我可以通过回调将其取回,那将是很棒的。

有任何想法吗 ?

4

1 回答 1

1

您需要的是一个闭包,因为循环以及item使用它,将在调用任何回调之前完成。

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

这应该与以下内容几乎相同(假设 items 是一个数组):

items.forEach(function(item){
  Model.find({'_id': item.id}, function(err, matches){
    console.log(item);
  });
})(items[idx]);
于 2013-09-10T15:22:38.147 回答