Използвайте async
библиотека, която е най-подходяща за този сценарий. Когато трябва да изпълните множество задачи, които не зависят една от друга и когато всички те завършат, направете нещо друго, трябва да използвате async.parallel()
метод. Сигнатурата е async.parallel(tasks, callback)
, където tasks е масив от функции.
Той незабавно ще изпълни всички функции паралелно, ще изчака всички те да извикат своята задача и накрая, когато всички задачи са завършени, ще изпълни обратно извикване (последното обратно извикване).
Следният пример демонстрира как това може да бъде адаптирано за вашия случай на употреба:
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);
});
});
});