2012-12-09 79 views
3

我有一個儀表板視圖(dashboard.jade),將顯示兩個面板與不同的信息,所有的信息應該從數據庫中檢索,然後發送到視圖發送多個數據庫查詢結果的單一視圖。使用快遞

比方說,我有兩個動作一個路由文件(document.js)定義:

exports.getAllDocuments = function(req, res){ 
    doc = db.model('documents', docSchema); 

    doc.find({}, function(err, documents) { 
     if (!err) { 
      // handle success 
     } 
     else { 
      throw err; 
     } 
    }); 
}; 

exports.getLatestDocumentTags = function(req, res){ 
    tags = db.model('tags', tagSchema); 

    tags.find({}, function(err, docs) { 
     if (!err) { 
      // handle success 
     } 
     else { 
      throw err; 
     } 
    }); 
}; 

這些功能只會從數據庫中檢索數據的porpuse。

現在我想將數據發送到儀表板視圖從我dashboard.js路由文件exports.index功能,其中i使我的儀表板視圖下。

的問題是,由於DB調用將是異步,我也不會對數據的訪問之前,我可以調用視圖。

我想我可以有一個動作,簡單地做了我所有的數據庫調用,並通過回調一次提供所有的數據視圖,這將使我的數據檢索的動作不能重複使用。

我對如何正確處理這個問題真的很困惑,可能我得到這個異步的事情都是錯誤的。有人可以給我一些關於如何正確執行此操作的提示嗎?

回答

5

這是一些激起你的興趣。

//Check out the async.js library 
var async = require('async'); 

//Set up your models once at program startup, not on each request 
//Ideall these would be in separate modules as wel 
var Doc = db.model('documents', docSchema); 
var Tags = db.model('tags', tagSchema); 

function index(req, res, next) { 
    async.parallel({ //Run every function in this object in parallel 
    allDocs: async.apply(Doc.find, {}) //gets all documents. async.apply will 
    //do the equivalent of Doc.find({}, callback) here 
    latestDocs: async.apply(Tags.find, {}) 
    ], function (error, results) { //This function gets called when all parallel jobs are done 
     //results will be like { 
     // allDocs: [doc1, doc2] 
     // latestDocs: [doc3, doc4] 
     // } 
     res.render('index', results); 
    }); 
} 
exports.index = index; 
}; 

嘗試一些更多的教程。如果你還沒有關於異步編程如何在節點中工作的時刻,那麼在嘗試編寫全新的程序而不用指導之前,請繼續閱讀有指導意義的手持教程。

2
//Check out the async.js library and mangoose model 
var mongoOp  = require("./models/mongo"); 
var async = require('async'); 


router.get("/",function(req,res){ 
    var locals = {}; 
    var userId = req.params.userId; 
    async.parallel([ 
     //Load user Data 
     function(callback) { 
      mongoOp.User.find({},function(err,user){ 
       if (err) return callback(err); 
       locals.user = user; 
       callback(); 
      }); 
     }, 
     //Load posts Data 
     function(callback) { 
       mongoOp.Post.find({},function(err,posts){ 
       if (err) return callback(err); 
       locals.posts = posts; 
       callback(); 
      }); 
     } 
    ], function(err) { //This function gets called after the two tasks have called their "task callbacks" 
     if (err) return next(err); //If an error occurred, we let express handle it by calling the `next` function 
     //Here `locals` will be an object with `user` and `posts` keys 
     //Example: `locals = {user: ..., posts: [...]}` 
     res.render('index.ejs', {userdata: locals.user,postdata: locals.posts}) 
    });