2012-12-26 26 views
6

Ich brauche ein paar unabhängige Datenbankabfragen in Node.js. Nachdem alle Abfragen ausgeführt wurden, sollte die Antwort gesendet werden. Mein erster Versuch sieht wie folgt aus:Parallele Funktionsaufrufe in Node.js

templateData = {}; 

model.getA(function(result) { 
    templateData.A = result; 

    model.getB(function(result) { 
     templateData.B = result; 

     model.getC(function(result) { 
      templateData.C = result; 

      response.send('template', templateData); 
     }) 
    }) 
}); 

Natürlich ist dieser Ansatz in Node.js ist überhaupt nicht gut, da alle Funktionen nacheinander aufgerufen werden und ich bin Vorteile asynchroner Programmierung Muster zu verlieren. Ich bin neu bei Node.js und es ist mir immer noch unklar, wie man getA(), getB() und getC() parallel anruft und eine Antwort sendet, sobald alles fertig ist. Gibt es einen wirklich einfachen und üblichen Weg dies zu erreichen?

Antwort

13

Verwenden Sie die async package: (npm install async)

async.parallel([ 
    function(){ ... }, 
    function(){ ... } 
], callback); 

https://github.com/caolan/async#parallel

Alternativ können Sie promises verwenden:

Q.spread(
    [ model.getA(), model.getB(), model.getC() ], 
    function(a, b, c) { 
     // set templateData 
     return templateData; 
    } 
).then(...); 

(unter der Annahme, dass die get*() Methoden Versprechen zurück)

+0

Danke, das ist genau das, was ich gesucht habe! –

2

Sie könnten einfach eine Funktion verwenden, die überprüft, ob alle Daten als Rückruf für Ihre Abfragen vorhanden sind. Wenn alle Daten vorhanden sind, kann die Antwort gesendet werden. So etwas wie

function checkData(){ 
    if (templateData.A && templateData.B && templateData.C){ 
     //send your response 
    } 
} 

dann einfach nicht nisten Ihre Anrufe

model.getA(function(result){ 
    templateData.A = result; 
    checkData(); 
} 

model.getB(function(result){ 
    templateData.B = result; 
    checkData(); 
} 

model.getC(function(result){ 
    templateData.C = result; 
    checkData(); 
} 

Wenn alle drei Ihre Antwort gesendet wird abgeschlossen haben.