2016-02-06 59 views
2

我必須在for循環中反覆運行貓鼬查詢,並且一旦完成,我想用express來呈現頁面。示例代碼如下。由於貓鼬異步運行,我怎麼才能使'命令/新'頁面渲染只有'命令'數組已填充for循環?for循環完成後在express中呈現頁面

... 
... 
var commands = []; 
for (var index=0; index<ids.length; index++) { 
    mongoose.model('Command').find({_id : ids[index]}, function (err, command){ 
     // do some biz logic with the 'command' object 
     // and add it to the 'commands' array 
     commands[index] = command; 
    }); 
} 

res.render('commands/new', { 
    commands : commands 
}); 
... 
... 

回答

2

你的基本for這裏循環不尊重您在執行每次迭代之前調用異步方法回調完成。所以簡單地使用一些相反的東西。節點async庫這裏適合該法案,而事實上對於數組迭代甚至更好的方法:

var commands = []; 

async.each(ids,function(id,callback) { 
    mongoose.model("Command").findById(id,function(err,command) { 
     if (command) 
      commands.push(command); 
     callback(err); 
    }); 
},function(err) { 
    // code to run on completion or err 
}) 

也因此async.each或可能像async.eachLimit一個變體,它只能運行的並行任務數量有限,集將你的更好的循環迭代控制方法在這裏。

注意:Mongoose的.findById()方法也有助於縮短編碼。