Vì vậy, bạn phải đợi tất cả các cuộc gọi lại trả về trước khi bạn gửi phản hồi. Nếu chúng tôi bỏ qua việc xử lý lỗi và kết quả trống để đơn giản, điều này có thể được thực hiện tương tự như:
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);
}
});
}
});
Với các lời hứa, hãy xem hàm Promise.all trả về một lời hứa mới. Lời hứa này được giải quyết khi tất cả các lời hứa được chuyển cho nó trong mảng được giải quyết. Với thư viện Q, nó sẽ giống như sau:
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));