Mongoose findOne范围存疑

Mongoose findOne scope doubts

本文关键字:范围 findOne Mongoose      更新时间:2023-09-26

我是javascript的新手,对猫鼬的"find"scope有一些疑问。

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

下面的代码搜索一个Shopping集合,然后搜索分配给此Shopping的Stores。

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数组打印的是空数组而不是存储数组呢?

Store.findOne和node.js中的许多东西一样,是异步的,并接受回调。您的回调是设置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中回调模式的一些示例/解释,这是理解的基础。