2011-12-06 6 views
0

データベースから取得した 'projects'のページをレンダリングしようとしています。ユーザー、自分が所有するプロジェクト、およびメンバーであるプロジェクトに関する2種類のプロジェクトがあります。2つのMongoDBデータベースクエリが完了したときにのみページをレンダリングする

私は2つの非同期データベースクエリを使用していますが、それらは異なる時間に終了する可能性があり、ページを両方とも完成させたいだけです。

質問: データベーストランザクションが完了するまで、レンダリングをどのように延期できますか?

var username = req.session.username; 
    var memberProjects = []; 
    var ownerProjects = []; 
    var membersQuery = false; 
    var ownerQuery = false; 

    projects.find({"members.username" : username}).toArray(function(err, results) 
    { 
    for(var i = 0; i < results.length; i++) 
    { 
     var project = { 
     title : results[i].title, 
     id : results[i]._id 
     } 
     memberProjects[i] = project; 
    } 
    membersQuery = true; 
    }); 

    projects.find({owner : req.session.username}).toArray(function(err, results) 
    { 
    for(var i = 0; i < results.length; i++) 
    { 
     var project = { 
     title : results[i].title, 
     id : results[i]._id 
     } 
     ownerProjects[i] = project; 
    } 
    ownerQuery = true; 
    }); 

    if(membersQuery && ownerQuery) 
    {   
    res.render('project', { 
     ownerProjects : ownerProjects, 
     memberProjects : memberProjects 
    });   
    } 

答えて

0

私は正しい答えがあるかどうかは分かりません。より良いアプローチがあれば私を修正してください。私は、各データベースのトランザクションの終了時に関数を呼び出しています:

var username = req.session.username; 
    var memberProjects = []; 
    var ownerProjects = []; 
    var membersQuery = false; 
    var ownerQuery = false; 

    projects.find({"members.username" : username}).toArray(function(err, results) 
    { 
    for(var i = 0; i < results.length; i++) 
    { 
     var project = { 
     title : results[i].title, 
     id : results[i]._id 
     } 
     memberProjects[i] = project; 
    } 
    membersQuery = true; 
    render(); 
    }); 

    projects.find({owner : req.session.username}).toArray(function(err, results) 
    { 
    for(var i = 0; i < results.length; i++) 
    { 
     var project = { 
     title : results[i].title, 
     id : results[i]._id 
     } 
     ownerProjects[i] = project; 
    } 
    ownerQuery = true; 
    render(); 
    }); 

    function render(){ 
    if(membersQuery && ownerQuery) 
    {   
     res.render('project', { 
     ownerProjects : ownerProjects, 
     memberProjects : memberProjects 
     });   
    } 
    } 
0

あなたのソリューションは、この特定の例のために動作しますが、あなたはStepまたはAsyncのようないくつかの制御フローのライブラリを使用する必要があります。ここで

は、私はステップでこれを行うだろう方法は次のとおりです。

var Step = require('step'), 
    username = req.session.username, 
    memberProjects = [], 
    ownerProjects = [], 
    membersQuery = false, 
    ownerQuery = false; 

Step(
    function getData() { 
    var that = this; 
    projects.find({"members.username" : username}).toArray(function(err, results) { 
     if (err) { throw new Error('database problem'); } 
     for(var i = 0; i < results.length; i++) { 
     var project = { 
      title : results[i].title, 
      id : results[i]._id 
     } 
     memberProjects[i] = project; 
     } 
     that.parallel(memberProjects); 
    }); 
    projects.find({owner : req.session.username}).toArray(function(err, results) { 
     if (err) { throw new Error('database problem'); } 
     for(var i = 0; i < results.length; i++) { 
     var project = { 
      title : results[i].title, 
      id : results[i]._id 
     } 
     ownerProjects[i] = project; 
     } 
     that.parallel(ownerProjects); 
    }); 
    }, 
    function renderTemplate(memberProjects, ownerProjects) { 
    res.render('project', { 
     ownerProjects : ownerProjects, 
     memberProjects : memberProjects 
    }); 
    } 
); 
関連する問題