Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Knoten Mysql asynchronisiert mehrere Abfragen

Sie müssen also warten, bis alle Rückrufe zurückkommen, bevor Sie die Antwort senden. Wenn wir der Einfachheit halber die Fehlerbehandlung und leere Ergebnisse ignorieren, kann dies ähnlich wie folgt erfolgen:

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);
        }
     });
   }
});

Sehen Sie sich bei Promises die Promise.all-Funktion an, die ein neues Promise zurückgibt. Dieses Versprechen wird aufgelöst, wenn alle ihm im Array übergebenen Versprechen aufgelöst werden. Mit der Q-Bibliothek sollte es so aussehen:

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));