2015-01-09 92 views
0

我有一個種子文件設置來填充我的mongodb。我正在設置一個計數器,這樣我可以在向數據庫添加新配方時自動增加一個值。現在我正在使用async.series在種子文件中運行不同的任務。在我所包含的內容中,您可以看到我設置的recipe_id等於此方法的返回值getNextSequence(計數器,「recipeid」)如何等待findOneAndUpdate完成後再繼續async.series

getNextSequence使用Counter模型來查詢(findOneAndUpdate)db。我相信findOneAndUpdate的回調從來不會被調用,因爲首先調用了async.series的回調函數。這是一個有趣的問題,因爲我需要確保getNextSequence在繼續前成功返回。不確定最好的方式去做這件事。

//seed.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; 
    } 
) 

}

回答

0

我不知道你使用的異步庫,讓我們假設它是這樣的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(); 
    }); 
+0

我用你的瀑布和檢修我的代碼。這是一團糟,但它現在正在工作。謝謝! – captainill 2015-01-10 05:55:22

相關問題