Така че трябва да изчакате всички обратни повиквания да се върнат, преди да изпратите отговора. Ако пренебрегнем обработката на грешки и празните резултати за простота, това може да се направи подобно на:
var callback = function(blogs) {
res.send(blogs);
}
connection.query("SELECT * FROM blogs ORDER BY time DESC", function(err, blogs, fields) {
var pending = blogs.length;
for (blog in blogs) {
connection.query("SELECT * FROM tags WHERE blog_id='blog.id' ", function(err, tags, fields) {
blog.tags = tags;
if (0 === --pending) {
callback(blogs);
}
});
}
});
С обещания погледнете функцията Promise.all, която връща ново обещание. Тези обещания се разрешават, когато всички обещания, предадени към него в масива, са разрешени. С библиотеката Q трябва да е нещо като:
var getTags = function(blog) {
var deferred = Q.defer();
connection.query("SELECT * FROM tags WHERE blog_id='blog.id' ", function(err, tags, fields) {
blog.tags = tags;
deferred.resolve();
});
return deferred.promise;
}
var promises = blogs.map(getTags(blog));
Q.all(promises).then(res.send(blogs));