Vous devez donc attendre que tous les rappels reviennent avant d'envoyer la réponse. Si nous ignorons la gestion des erreurs et les résultats vides pour plus de simplicité, cela peut être fait comme :
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);
}
});
}
});
Avec les promesses, examinez la fonction Promise.all qui renvoie une nouvelle promesse. Cette promesse est résolue lorsque toutes les promesses qui lui sont transmises dans le tableau sont résolues. Avec la bibliothèque Q, cela devrait ressembler à :
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));