Javascript 在嵌套mongoose函数完成之前完成循环

Javascript 在嵌套mongoose函数完成之前完成循环,javascript,node.js,mongodb,asynchronous,mongoose-populate,Javascript,Node.js,Mongodb,Asynchronous,Mongoose Populate,总之,我正在编写一个post函数,它包含一个for循环,其中包含三个嵌套的mongoose函数(findOne、findById和create)。然而,在进入下一个“i”之前,这些功能似乎还没有完成。此代码的console.log决不等于5这一事实就证明了这一点。我做了大量的研究,了解到问题在于这些mongoose函数是异步的,但我还没有遇到这样的问题:人们有三个嵌套函数,如下所示。有没有办法让函数在循环进行之前完成 谢谢 为了简单起见,我将I设置为=sellYesPricesMin){ 对于(

总之,我正在编写一个post函数,它包含一个for循环,其中包含三个嵌套的mongoose函数(findOne、findById和create)。然而,在进入下一个“i”之前,这些功能似乎还没有完成。此代码的console.log决不等于5这一事实就证明了这一点。我做了大量的研究,了解到问题在于这些mongoose函数是异步的,但我还没有遇到这样的问题:人们有三个嵌套函数,如下所示。有没有办法让函数在循环进行之前完成

谢谢

为了简单起见,我将I设置为<5,尽管这在我的代码中由一个变量表示。此外,让我们假设价格大于sellYesPricesMin

var quantity = 0;
if(price >= sellYesPricesMin){
    for (i = 0; i < 5; i ++){
        if(price >= sellYesPricesMin && sellYesPricesMin>0){
            Order.findOne({"yes_or_no":"NO", "buy_or_sell":"BUY","event.id":req.params.id},function(err, foundOrder){
                if(err){
                    console.log(err);
                } else {
                    User.findById(foundOrder.author.id, function(err, foundUser){
                        if(err){
                            console.log( err);
                        } else {
                            Share.create({}, function (err, newShare) {
                                if (err){
                                    console.log(err);
                                    quantity = quantity + 1;
                                    sharesCreated++;   
                                    campground.shares.push(newShare);    
                                    campground.save();
                                    foundUser.save();
                                }
                            });
                        }
                    });
                }
            });
        } else {    
            campground.buyYesPrices.push(parseFloat(Math.round(price * 100) / 100).toFixed(2));            
            req.user.save();
            campground.save();
        }
        req.user.save();
        campground.save();
    }
    console.log("QUANTITY: " + quantity);
} else {
    // BLAH BLAH BLAH
}
var数量=0;
如果(价格>=sellYesPricesMin){
对于(i=0;i<5;i++){
如果(价格>=SellYesSpricesMin&&SellYesSpricesMin>0){
Order.findOne({“yes”或“no”:“no”,“buy”或“sell”:“buy”,“event.id”:req.params.id},函数(err,foundOrder){
如果(错误){
控制台日志(err);
}否则{
User.findById(foundOrder.author.id,函数(err,foundUser){
如果(错误){
控制台日志(err);
}否则{
创建({},函数(err,newShare){
如果(错误){
控制台日志(err);
数量=数量+1;
sharesCreated++;
露营地。股票。推送(新闻分享);
campground.save();
foundUser.save();
}
});
}
});
}
});
}否则{
露营地。购买精神。推(parseFloat(数学轮(价格*100)/100)。toFixed(2));
req.user.save();
campground.save();
}
req.user.save();
campground.save();
}
控制台日志(“数量:+数量);
}否则{
//废话废话
}

根据上述场景,我的理解是,您希望在函数外部以同步执行这些函数的状态访问某些变量

您可以将这些变量绑定到这些函数,这些执行将按照您希望的方式执行

我正在编写一个小代码,它将帮助您理解这个概念

for (var i = 0; i < 10; i++) {

    asynccall("Hello", function (others, err, data) {
        console.log("Others is same as i in synchrnous call " + others);
    }.bind(this, i));
}
for(变量i=0;i<10;i++){
asynccall(“你好”,函数(其他、错误、数据){
log(“其他与同步调用中的我相同”+其他);
}.绑定(这个,我));
}

由于所有这些调用都是异步的,它基本上会一次完成所有调用,并且不会等待任何一个部分完成。因此,它很可能是在违反程序。对我来说,更容易把它看作是一堆不同的线程。如果需要异步部分按顺序运行,您可能需要基本上暂停该部分的异步部分。

所有这些函数都是异步的,Node不会等待它完成,它将移动到下一个函数。