This question already has answers here:
Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference
                                
                                    (6个答案)
                                
                        
                                5年前关闭。
            
                    
我对这个javascript东西不熟悉,对猫鼬的“查找”范围有一些疑问。

我写了下面的代码来尝试理解问题。

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

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是异步的,并采用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中回调模式的一些示例/解释,这是理解的基础。

关于javascript - Mongoose findOne范围怀疑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26125424/

10-09 22:20