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模式的示例/解释,这是理解的基础。