如何等待findOneAndUpdate完成,然后再继续async.series

How to wait for findOneAndUpdate to finish before continuing async.series

本文关键字:然后 再继续 async series 完成 findOneAndUpdate 何等待 等待      更新时间:2023-09-26

我有一个种子文件设置来填充我的mongodb。我正在设置一个计数器,以便在将新配方添加到数据库时自动增加值。现在我正在使用 async.series 来运行种子文件中的不同任务。在我包含的内容中,您可以看到我在哪里设置recipe_id等于此方法返回值getNextSequence(计数器,"recipeid")

getNextSequence 使用计数器模型来查询 (findOneAndUpdate) 数据库。我相信 findOneAndUpdate 的回调永远不会被调用,因为首先调用了 async.series 的回调。这是一个有趣的问题,因为我需要确保getNextSequence在继续之前已成功返回。不确定最好的方法。

/

/种子.js//不完整

        var getNextSequence = require('./utils/getNextSequence').getNextSequence;
        recipes = new mongo.Collection(db, "recipes");
        counters = new mongo.Collection(db, "counters");
        async.series([
            function(callback){
                //initiate counter
                counters.insert(
                {
                  _id: "recipeid",
                    seq: 0
                },function(err, rec){
                        callback(err, rec);
                })
            },
            function(callback){
                //add test recipes
                recipes.insert([{
                    recipe_id: getNextSequence(counters, "recipeid"),
                    title:'title 1',
                    body:'body 1',
                    author: [seedUsers[1]._id],
                    categories: [ seedCategories[0]._id, seedCategories[1]._id ],
                    create_at: new Date()
                },{
                    recipe_id: getNextSequence(counters, "recipeid"),
                    title:'title 2',
                    body:'body 2',
                    author: [seedUsers[1]._id],
                    categories: [ seedCategories[1]._id ],
                    create_at: new Date()
                }], function(err, rec){
                    callback(err, rec);
                })
            }
        ],
        // optional callback
        function(err, results){
          //console.log(''n', results);
          db.close();
        });
/

/getNextSequence.js

var Counter = require('../counter').Counter;
exports.getNextSequence = function(counters, name) {
Counter.findOne({ '_id': 'recipeid' }, function (err, counter) {
  //if (err) return handleError(err);
  //never called
  console.log('---counter seq=', counter.seq);
})
Counter.findOneAndUpdate({ _id: name }, { $inc: { seq: 1 } }, { new: true }, function(err, counter){
 //never called
    console.log('counter.seq', counter.seq);
    return counter.seq;
  }
)

}

我不确定您使用的是哪个异步库,让我们假设它是这个 https://github.com/caolan/async

您可能需要先运行getNextSequence,然后再插入收据。稍微更改一下getNextSequence,以便async知道findOneAndUpdate过程何时完成。我也改用waterfall,所以一个任务的结果被传递给下一个任务

var Counter = require('../counter').Counter;
exports.getNextSequence = function (counters, name, callback) {
  Counter.findOne({'_id': 'recipeid'}, function (err, counter) {
    //if (err) return handleError(err);
    //never called
    console.log('---counter seq=', counter.seq);
  })
  Counter.findOneAndUpdate({_id: name}, {$inc: {seq: 1}}, {new: true}, function (err, counter) {
      //never called
      console.log('counter.seq', counter.seq);
      callback(null, counter.seq);
    }
  )
}

播种

var getNextSequence = require('./utils/getNextSequence').getNextSequence;
recipes = new mongo.Collection(db, "recipes");
counters = new mongo.Collection(db, "counters");
async.waterfall([
    function (callback) {
      //initiate counter
      counters.insert(
        {
          _id: "recipeid",
          seq: 0
        }, function (err, rec) {
          callback(err, rec);
        })
    },
    function (callback) {
      getNextSequence(counters, "recipeid", callback);
    },
    function (seq, callback) {
      //add test recipes
      recipes.insert({
        recipe_id: seq,
        title: 'title 1',
        body: 'body 1',
        author: [seedUsers[1]._id],
        categories: [seedCategories[0]._id, seedCategories[1]._id],
        create_at: new Date()
      }, function (err, rec) {
        callback(err, rec);
      })
    },
    function (callback) {
      getNextSequence(counters, "recipeid", callback);
    },
    function (seq, callback) {
      //add test recipes
      recipes.insert({
        recipe_id: seq,
        title: 'title 2',
        body: 'body 2',
        author: [seedUsers[1]._id],
        categories: [seedCategories[1]._id],
        create_at: new Date()
      }, function (err, rec) {
        callback(err, rec);
      })
    }
  ],
  // optional callback
  function (err, results) {
    //console.log(''n', results);
    db.close();
  });