Javascript Mongoose findOne未完成回调函数

Javascript Mongoose findOne未完成回调函数,javascript,callback,mongoose,Javascript,Callback,Mongoose,好的,我有一个JS方法,它使用Lodash和mongoose在mongoose集合中查找文档。这看起来很好,但在转到下一个要查找的文档之前,似乎没有完成回调函数。以下是我的职责: importParts: function(participants, event_id, done){ _.forEach(participants, function (participant) { var race = {event_id: event_id, chip_number_64: pa

好的,我有一个JS方法,它使用Lodash和mongoose在mongoose集合中查找文档。这看起来很好,但在转到下一个要查找的文档之前,似乎没有完成回调函数。以下是我的职责:

importParts: function(participants, event_id, done){
    _.forEach(participants, function (participant) {
    var race = {event_id: event_id, chip_number_64: participant.chip_number_64};
        Runner.findOne({contact_id: participant.contact_id}, function (err, doc) {
            if (err) {
                logger.error('CANNOT FIND AND UPDATE RUNNER BECAUSE OF: ', err);
                done(err);
            }
            logger.info("IN FINDONE");
            if (doc === null) {
                logger.info("IN FINDONE1");
                participant.races = [race];
                Runner.create(participant, function (err, row, rowsAffected) {
                    if (err) {
                        logger.error('FAILED TO IMPORT PARTICIPANT: ', doc);
                        logger.error(err);
                        done(err);
                    }
                    logger.info("IN FINDONE2");
                });
             }
          });
       };
    done(null);
}  

出于某种原因,上面的代码不支持回调函数,并且似乎异步返回到调用此回调函数的主方法。这就好像在一段设定的时间之后,回调才被接受,或者发生了不应该发生的异步事件,因为我已经将所有内容都打包在回调中。所以我只是想找出为什么在执行查询时回调没有完成?而且,即使没有上述代码中包含的forEach迭代,这种情况仍然会发生。

对findOne和create的调用是异步的。执行查询,并在响应就绪时调用回调。这段代码的问题是在这些异步函数完成执行之前调用了donenull。您应该在回调中调用done,但这样会中断forEach循环。你需要以某种方式重构这段代码。@Gergo Erdosi-是的,很抱歉,它实际上是在循环之后完成的,但是,我在foreach块上有一个额外的括号。现在编辑它。find是否执行相同的异步行为?这就是问题所在,donenull正在跟踪循环。目前的执行情况是:1。芬顿,2。多内努尔,3岁。findOne的回调。调用findOne时,此脚本将继续执行,donenull不会等待回调完成。@GergoErdosi-看起来我只需要进行这两次http调用,或者是否有什么方法可以等到mongoose回调完成后再继续?它适用于一个文档,但会破坏foreach,因为在执行第一次回调时会立即调用done,所以它不会等待循环中的其他回调。