collection.findOne总是最后执行

时间:2018-08-25 22:22:09

标签: node.js mongodb express for-loop mongoose

我不明白为什么在猫鼬/函数中的代码之前执行底部的命令。

router.post("/path", function(req, res, next) {
    for(var i = 0; i < req.body.getname.length; i++) {
       Bun.findOne({title: req.body.getname[i]}, function(err, data) {
          console.log("second")
       })
    }
    console.log("first")
})

1 个答案:

答案 0 :(得分:0)

findOne方法是一种异步方法,在执行其回调之前会等待响应。在您的情况下,for loop立即开始执行异步调用,但是由于尚未收到响应,因此代码继续以代码console.log("first")开始。收到findOne的响应后,它将执行回调中的所有代码。

要使该行在回调中的代码之前执行,请尝试以下两种方法

router.post("/path", function(req, res, next) {
    console.log("first")
    for(var i = 0; i < req.body.getname.length; i++) {
        Bun.findOne({title: req.body.getname[i]}, function(err, data) {
            console.log("second");
        });
    }
});

OR

router.post("/path", function(req, res, next) {
    for(var i = 0; i < req.body.getname.length; i++) {
        Bun.findOne({title: req.body.getname[i]}, function(err, data) {
            //Bring that line first
            console.log("first");

            console.log("second");
        });
    }
}