Använd async
bibliotek som är bäst lämpat för detta scenario. Om du behöver köra flera uppgifter som inte är beroende av varandra och när de alla är klara med att göra något annat, bör du använda async.parallel()
metod. Signaturen är async.parallel(tasks, callback)
, där uppgifter är en rad funktioner.
Det kommer omedelbart att köra alla funktioner parallellt, vänta på att alla ska ringa tillbaka sin uppgift, och slutligen när alla uppgifter är klara kommer den att köra återuppringning (den sista återuppringningen).
Följande exempel visar hur detta kan anpassas för ditt användningsfall:
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);
});
});
});