我对这个javascript的事情不熟悉,并且我对猫鼬有一些疑问,并且发现了'范围' S
我写下面的代码试图理解这个问题。
以下代码搜索购物集合,然后搜索分配给此购物的商店。
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数组会打印一个空数组而不是存储数组?
答案 0 :(得分:1)
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中查看回调模式的一些示例/解释,这是理解的基础。