2016-07-22 5 views
0

Ich versuche eine Funktion zu erstellen, die die Datenbank abfragt und eine Liste von Objekten zurückgibt und für jedes Objekt muss ich die Datenbank abfragen und zurückgeben Ergebnis aller Abfragen.Warten, bis N Anzahl der Abfragen beendet ist, bevor die Callback - Funktion mit Nodejs aufgerufen wird

Wie warten, bis alle Abfragen abgeschlossen sind, oder sollte ich sie auf eine synchrone Weise tun? Wenn das so ist, wie ? Sollte ich nicht die Tatsache ausnutzen, dass sie alle ausgewählte Abfragen sind und nicht voneinander abhängen, also parallel laufen, um die Zeit zu optimieren? Ist das ein schlechtes Design? oder vielleicht sollte ich gespeicherte Prozeduren dafür verwenden?

getTopActiveUsers:function(callback) { 
    pool.connect(function (err, client, done) { 
     if (err) 
      callback(null, err); 
     else { 
      User.finAll(client,function(users) { 
       for(var i=0;i<users.length;i++) { 
        Application.findByUser(users[i].id,function(applications) { 
         // here i have the applications for user i 
        }) 
       } 
       // need to call the callback function when all queries finishes 
      }) 
     } 
    }); 
} 

Antwort

3

async Bibliothek ist für Sie. Die parallele Methode führen Sie alle Ihre Anfragen parallel, und warten Sie, dass alle fertig sind.

getTopActiveUsers : function(callback) { 
pool.connect(function(err, client, done) { 
    if (err) { 
     callback(null, err); 
    } else { 
     User.finAll(client, function(users) { 
      var requests = []; 

      for (var i = 0; i < users.length; i++) { 
       requests.push(function(asyncCallback) { 
        Application.findByUser(users[i].id, function(applications) { 
         // here i have the applications for user i 
         asyncCallback(); 
        }); 
       }); 

      } 

      async.parallel(requests, function(err) { 
       // Requests are finished here 
      }); 
     }) 
    } 
}); 
} 

Dokumentation:http://caolan.github.io/async/

1

Da diese können alle parallel ausgeführt werden, ist die einfachste Art und Weise mit dem Code haben Sie bereits ist, nur einen Zähler zu halten:

getTopActiveUsers:function(callback) { 
    pool.connect(function (err, client, done) { 
     if (err) 
      callback(null, err); 
     else { 
      User.findAll(client,function(users) { 
       var doneCnt = 0; 
       for(var i=0;i<users.length;i++) { 
        Application.findByUser(users[i].id,function(applications) { 
         // here i have the applications for user i 
         ++doneCnt; 
         if (doneCnt === users.length) { 
          callback(null, someResult); 
         } 
        }) 
       } 
      }) 
     } 
    }); 
} 

Eine Ein fortgeschrittener (und flexiblerer) Mechanismus wäre, eine auf Versprechen basierende Schnittstelle zu Ihrer Datenbank zu erlernen und zu verwenden, und dann können Sie Promise.all() verwenden, um zu verfolgen, wenn mehrere asynchrone Operationen ausgeführt werden.

Verwandte Themen