Use o async biblioteca que é mais adequada para este cenário. Onde você precisar executar várias tarefas que não dependem umas das outras e quando todas terminarem fazer outra coisa, você deve usar
async.parallel()
método. A assinatura é async.parallel(tasks, callback)
, em que tasks é uma matriz de funções. Ele executará imediatamente todas as funções em paralelo, aguardará que todos chamem seu retorno de chamada de tarefa e, finalmente, quando todas as tarefas forem concluídas, ele executará o retorno de chamada (o retorno de chamada final).
O exemplo a seguir demonstra como isso pode ser adaptado para seu caso de uso:
router.get('/profile', function(req, res, next) {
mongo.connect(url, function(err, db) {
var locals = {};
var tasks = [
// Load users
function(callback) {
db.collection('users').find({}).toArray(function(err, users) {
if (err) return callback(err);
locals.users = users;
callback();
});
},
// Load colors
function(callback) {
db.collection('colors').find({}).toArray(function(err, colors) {
if (err) return callback(err);
locals.colors = colors;
callback();
});
}
];
async.parallel(tasks, function(err) { //This function gets called after the two tasks have called their "task callbacks"
if (err) return next(err); //If an error occurred, let express handle it by calling the `next` function
// Here `locals` will be an object with `users` and `colors` keys
// Example: `locals = {users: [...], colors: [...]}`
db.close();
res.render('profile/index', locals);
});
});
});