猫鼬找到一个范围的疑惑

时间:2014-09-30 16:13:59

标签: javascript arrays node.js mongodb mongoose

我对这个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数组会打印一个空数组而不是存储数组?

1 个答案:

答案 0 :(得分:1)

与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中查看回调模式的一些示例/解释,这是理解的基础。