Javascript 在嵌套mongoose函数完成之前完成循环
总之,我正在编写一个post函数,它包含一个for循环,其中包含三个嵌套的mongoose函数(findOne、findById和create)。然而,在进入下一个“i”之前,这些功能似乎还没有完成。此代码的console.log决不等于5这一事实就证明了这一点。我做了大量的研究,了解到问题在于这些mongoose函数是异步的,但我还没有遇到这样的问题:人们有三个嵌套函数,如下所示。有没有办法让函数在循环进行之前完成 谢谢 为了简单起见,我将I设置为<5,尽管这在我的代码中由一个变量表示。此外,让我们假设价格大于sellYesPricesMinJavascript 在嵌套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){ 对于(
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不会等待它完成,它将移动到下一个函数。