Utilisez le async
bibliothèque qui convient le mieux à ce scénario. Lorsque vous devez exécuter plusieurs tâches qui ne dépendent pas les unes des autres et qu'elles ont toutes fini de faire autre chose, vous devez utiliser async.parallel()
méthode. La signature est async.parallel(tasks, callback)
, où tâches est un tableau de fonctions.
Il exécutera immédiatement toutes les fonctions en parallèle, attendra que toutes appellent leur rappel de tâche, et enfin lorsque toutes les tâches seront terminées, il exécutera le rappel (le rappel final).
L'exemple suivant montre comment cela pourrait être adapté à votre cas d'utilisation :
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);
});
});
});