2014-02-11 78 views
0

在這種情況下,您如何避免異步調用每次res.render過早並且缺少狀態的對象時,我都嘗試了所有操作。 playingCollection是一個mongodb集合。Mongodb異步調用?

var state = []; 
playingCollection.find({},function(err, companies) { 
    companies.each(function(err,company){ 
     if (company !== null) { 
      var obj = company.playername; 
      state.push(obj); 
     } 
     res.render('index', { title: 'Demo', error: req.query.error, players: state, head: 'Currently playing:'}); 
     state = []; 
     return; 
    }); 
});  

回答

1

這裏是處理這種使用指定者的電話後找到()的一種方法:

playingCollection.find({}).toArray(function(err, companies) { 

    if(err) { 
    res.render('error', {whatever}); 
    return; 
    } 

    var state = []; 
    var i; 
    for(i=0; i<companies.length; i++) { 
     state.push(companies[i].playername);   
    } 
    res.render('index', { title: 'Demo', error: req.query.error, players: state, head: 'Currently playing:'}); 

}); 
0

下面是一個使用從find返回的Cursor對象的簡單方法。它僅依賴於當列表用盡時each呼叫將通過null的事實。

var state = []; 
playingCollection.find({}).each(function(err, company) { 
    if (company !== null) { 
     state.push(company.playername); 
    } else { 
     res.render('index', { title: 'Demo', error: req.query.error, players: state, 
          head: 'Currently playing:'}); 
     return; 
    } 
});  

如果你知道你是隻從收集一個領域感興趣,你也應該使用可選projection參數限制結果:

playingCollection.find({}, { playername: 1 }).each(....); 

在上面的,它只會返回playername_id字段爲每個文件。