This question already has answers here:
Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference
(6个答案)
5年前关闭。
我对这个javascript东西不熟悉,对猫鼬的“查找”范围有一些疑问。
我写了下面的代码来尝试理解问题。
下面的代码搜索到购物集合,然后搜索分配给该购物的商店。
storeMap是storeId => storeObject的哈希图,但是当Store.findOne范围结束时,storeMap似乎回滚到一个空数组...
那么,为什么我的storeMap数组打印的是空数组而不是存储数组?
并且仅在
但是,以下行
我建议看一下node.js中回调模式的一些示例/解释,这是理解的基础。
(6个答案)
5年前关闭。
我对这个javascript东西不熟悉,对猫鼬的“查找”范围有一些疑问。
我写了下面的代码来尝试理解问题。
下面的代码搜索到购物集合,然后搜索分配给该购物的商店。
storeMap是storeId => storeObject的哈希图,但是当Store.findOne范围结束时,storeMap似乎回滚到一个空数组...
var storeMap = {};
Shopping.findOne({ name: shoppingName }, function(err, shopping){
shopping.stores.forEach(function(storeId) {
Store.findOne({_id: storeId}, function(err, store) {
if(err) console.log(err);
console.log(store); //prints out store data
storeMap[storeId] = store;
console.log(storeMap); //prints out store data
});
console.log(storeMap); //prints out an empty array
});
});
那么,为什么我的storeMap数组打印的是空数组而不是存储数组?
最佳答案
就像node.js中的许多东西一样,Store.findOne
是异步的,并采用callback。您的回调是设置storeMap
的位置:
function(err, store) {
if(err) console.log(err);
console.log(store); //prints out store data
storeMap[storeId] = store;
console.log(storeMap); //prints out store data
}
并且仅在
Store.findOne
完成工作后才能运行,这可能需要很长时间。但是,以下行
console.log(storeMap);
立即执行-在回调运行之前。因此,storeMap仍然为空。我建议看一下node.js中回调模式的一些示例/解释,这是理解的基础。
关于javascript - Mongoose findOne范围怀疑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26125424/
10-09 22:20