2013-11-23 53 views
0

使用node.js和MongoDB存儲實時數據流。在我的程序DBSetUp()驅動的async:series連接到MongoDB並完成初始設置。在初始設置完成後,DBInsert()將數據插入到集合中。由於會有大量的DBInsert()調用,因此我將這些函數分開。我不知道如何讓DBInsert()等到DBSetUp()執行完成。node.js mongodb - 如何使插入等待單元連接建立?

似乎我可以在DBInsert()中使用async:series來保持循環,直到DBSetUp()在插入前執行完成。我不知道如何實施。有更好的想法嗎?非常感謝你的想法。

代碼片段

var mongodb = require('mongodb'); 
MongoClient = mongodb.MongoClient; 
var async = require('async'); 

... 

// Connect to DB and get handle to collection using async:series 
DBSetUp(); 

// Wait for DBSetup before inserting  
DBInsert(); 

.... 

回答

0

在異步一系列的DBSetUp回調,你可以叫你DBInsert。

async.series(tasks, function(err, results) { DBInsert(); }); 

創建一個變量,該變量存儲到客戶端的連接以及通過回調返回連接mongo連接的函數。如果您的連接已定義,則可以返回預先連接。否則,它將調用DBSetUp,保存到變量的連接,然後包裝函數將通過回調返回連接。這樣,您可以使用相同的功能來請求訪問數據庫,而無需知道連接是否存在。

var conn = null 
getDB = function(cb) { 
    if(conn) 
    return cb(null, conn) 
    else 
    DBSetUp(cb); 
} 
+0

是的,如果我有所有要插入的數據,這將工作。由於我正在存儲實時流數據,因此我正在尋找一個可靠的解決方案。 – harishvc

+0

好的,我剛剛添加了另一個建議 – sheldonk

0

解決!在node.js谷歌組上找到解決方案。以下是代碼片段:

function DBInsert()` 
{ 
    async.series([ 
    function (callback) { 
     //Check pre-conditons before insert 
     ReadyNow("check", function (err) { 
      callback(); 
     }); 
    }, 
    function (callback) { 
     // Insert 
     callback(); 
    } 
} 

Function ReadyNow(something,callback) 
{ 
    setTimeout(function() { 
    // check pre-conditions 
    if (#pre-conditions#) {   
     callback(); 
    } 
    else 
    { 
    setTimeout(arguments.callee, 20); 
    } 
    }, 20); 
} 
+1

這是一個駭人聽聞的解決方案,我很抱歉地說。 – robertklep