Sử dụng async
thư viện phù hợp nhất cho tình huống này. Trường hợp bạn cần chạy nhiều tác vụ không phụ thuộc vào nhau và khi tất cả chúng hoàn thành, hãy làm việc khác, bạn nên sử dụng async.parallel()
phương pháp. Chữ ký là async.parallel(tasks, callback)
, trong đó các nhiệm vụ là một mảng các chức năng.
Nó sẽ ngay lập tức chạy tất cả các chức năng song song, đợi tất cả chúng thực hiện lệnh gọi lại tác vụ của chúng và cuối cùng khi tất cả các tác vụ hoàn thành nó sẽ chạy lệnh gọi lại (lệnh gọi lại cuối cùng).
Ví dụ sau minh họa cách điều này có thể được điều chỉnh cho trường hợp sử dụng của bạn:
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);
});
});
});