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

时间:2017-01-25 04:20:23

标签: javascript node.js mongodb asynchronous mongoose-populate

全部,我正在编写一个post函数,其中包含一个带有三个嵌套mongoose函数的for循环(findOne,findById& create)。但是,在进入下一个“i”之前,似乎功能没有完成。事实证明,这个代码的console.log永远不会等于5.我已经做了大量研究并且理解问题是这些猫鼬函数是异步的,但是我还没有遇到人们的问题有三个嵌套函数,如下所示。有没有办法让这些函数在循环之前完成?

谢谢!

为简单起见,我把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
}

2 个答案:

答案 0 :(得分:2)

根据上面的场景,我理解的是你想要在一个状态下访问函数外部的某个变量,好像这些函数是同步执行的。

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

我正在编写一个小代码,可以帮助您理解这个概念。

http.Get("http://oneness287-2.myshopify.com/cart/29741797961:1")

答案 1 :(得分:0)

由于所有这些调用都是异步的,它基本上会一次完成所有这一切,它不会等待任何一个部分完成。因此它可能不按顺序进行。对我来说,它更容易被认为是一堆不同的线程。如果您需要按顺序运行,则可能必须基本上pause此部分的异步部分。