2014-09-30 98 views
1

我是新来这个javascript的东西,我有一些关于猫鼬'发现'范围的怀疑。猫鼬findOne范围怀疑

我写了下面的代码来试图理解这个问题。

下面的代码搜索购物集合,然后搜索分配给此购物的商店。

storeMap是STOREID => storeObject的一个HashMap,但是当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阵列印刷空数组而不是存储数组?

回答

1

Store.findOne就像node.js中的许多事情是异步的,并且需要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中回调模式的一些例子/解释,这是理解的基础。