Use el async
biblioteca que es la más adecuada para este escenario. Cuando necesite ejecutar múltiples tareas que no dependen unas de otras y cuando todas terminen hagan otra cosa, debe usar async.parallel()
método. La firma es async.parallel(tasks, callback)
, donde tareas es una matriz de funciones.
Inmediatamente ejecutará todas las funciones en paralelo, esperará a que todas ellas llamen a la devolución de llamada de su tarea y, finalmente, cuando todas las tareas estén completas, ejecutará la devolución de llamada (la devolución de llamada final).
El siguiente ejemplo demuestra cómo se podría adaptar esto para su 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);
});
});
});