我正在尝试学习Node.js,并使用MEAN堆栈编写一个Web应用程序。
当我将包含项目数据(例如,["one", "two", "three"]
)的字符串数组发送到服务器端时,我有以下代码来遍历该数组,检查MongoDB中是否已包含具有该元素的文档,然后相应地创建新的数据库中的文档。
服务器端代码:
// items is an array of strings sent from the client side
for (var i = 0; i < items.length; i++) {
var item_name = items[i];
// For each item, find an existing one
Item.findOne({'name': item_name }, function(err, item) {
// If not already existing, add to database.
if (!item) {
var new_item = new Item();
new_item.name = item_name;
new_item.save(function(err) {
if (err) throw err;
});
}
});
}
}
问题是
new_item.name
始终等于数组中的最后一个元素,即"three"
我的猜测是数据库中的查询花费的时间比循环要长,因此,当我们进入
findOne()
的回调时,我们已经迭代到数组的末尾。这是真的?如果是这样,该问题将如何解决?
我了解到,这可能是许多人以前曾问过的一个常见问题,但是经过一段时间的搜索,我仍然无法解决问题。请指教。
最佳答案
已经有一条评论说要这样做。您可以创建闭包(如下所示)或创建循环外的单独函数。这是有关闭包http://jondavidjohn.com/blog/2011/09/javascript-closure-explained-using-events的小博文
// items is an array of strings sent from the client side
for (var i = 0; i < items.length; i++) {
(function(item_name) {
// For each item, find an existing one
Item.findOne({'name': item_name }, function(err, item) {
// If not already existing, add to database.
if (!item) {
var new_item = new Item();
new_item.name = item_name;
new_item.save(function(err) {
if (err) throw err;
});
}
});
})(items[i]);
}
关于java - MEAN Stack-延迟查询和请求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22184789/