mongoosefindOne范围怀疑
我是新来的这个JavaScript的东西,我有一些关于mongoose'发现'范围的怀疑。
我写了下面的代码来试图理解这个问题。
下面的代码search购物集合,然后search分配给此购物的商店。
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
是asynchronous的并且需要callback 。 你的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);
在callback运行之前立即执行。 因此,storeMap仍然是空的。
我build议在node.js中查看一些callback模式的示例/解释,这是理解的基础。