2012-12-26 14 views
6

Ho bisogno di fare alcune query di database indipendenti in Node.js. Dopo che tutte le query sono state eseguite, è necessario inviare una risposta. Il mio primo tentativo è simile al seguente:Chiamate di funzione parallele 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); 
     }) 
    }) 
}); 

Naturalmente, questo approccio in Node.js non è affatto buono, perché tutte le funzioni sono chiamate in modo sequenziale e sto perdendo vantaggi del modello di programmazione asincrona. Sono nuovo a Node.js e non mi è ancora chiaro come chiamare getA(), getB() e getC() in parallelo e inviare una risposta subito dopo che tutto è finito. C'è un modo veramente semplice e comune per raggiungere questo obiettivo?

risposta

13

Utilizzare la async package: (npm install async)

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

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

In alternativa, è possibile utilizzare promises:

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

(assumendo che i metodi get*() restituiscono promesse)

+0

Grazie, è esattamente quello che stavo cercando! –

2

È possibile utilizzare solo una funzione che controlla se tutti i dati sono presenti come richiamata alle query e se tutti i dati sono presenti, è possibile inviare la risposta. Quindi, qualcosa di simile a

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

poi basta non fare il nido le chiamate

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

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

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

Quando tutti e tre hanno completato la vostra risposta verrà inviata.

Problemi correlati