2014-02-11 75 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字段为每个文件。