2012-12-26 24 views
6

Potrzebuję wykonać kilka niezależnych zapytań do bazy danych w pliku Node.js. Po wykonaniu wszystkich zapytań odpowiedź powinna zostać wysłana. Moja pierwsza próba wygląda następująco:Równoległe wywołania funkcji w pliku 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); 
     }) 
    }) 
}); 

Oczywiście, takie podejście w node.js nie jest dobre w ogóle, ponieważ wszystkie funkcje są wywoływane kolejno i jestem tracąc zalet asynchronicznego programowania wzorca. Jestem nowy w Node.js i nadal nie jestem pewien, jak połączyć się z getA(), getB() i getC() równolegle i wysłać odpowiedź zaraz po zakończeniu wszystkich czynności. Czy jest jakiś naprawdę prosty i powszechny sposób, aby to osiągnąć?

Odpowiedz

13

Użyj async package: (npm install async)

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

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

Alternatywnie, można użyć promises:

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

(zakładając, że metody get*() powrócić obietnic)

+0

Dzięki, właśnie tego szukałem! –

2

Można użyć funkcji sprawdzającej, czy wszystkie dane są obecne jako oddzwonienie do zapytań, a jeśli wszystkie dane są obecne, odpowiedź może zostać wysłana. Więc coś

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

potem po prostu nie zrobić gniazdo twoje rozmowy

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

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

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

Kiedy wszystkie trzy zakończyły swoją odpowiedź zostanie wysłana.