2012-12-26 27 views
6

Node.js.'de birkaç bağımsız veritabanı sorgusu yapmalıyım. Tüm sorgular yürütüldükten sonra yanıt gönderilmelidir. İlk deneme şöyle görünür: tüm fonksiyonlar sırayla denir ve ben asenkron programlama modelinin avantajlarını kaybetmeden olduğum için tabiiParalel işlev çağrıları Node.js içinde

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

, node.js bu yaklaşım, hiç iyi değil. Ben Node.js için yeni ve hala bana her şey bittikten sonra getA(), getB() ve getC() aramayı ve yanıt göndermek için bana açık değil. Bunu başarmanın bazı basit ve ortak yolu var mı?

cevap

13

Kullanım async package: Alternatif (npm install async)

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

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

, sen promises kullanabilirsiniz:

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

(varsayarak get*() yöntemleri sözler dönmek olduğunu)

+0

Teşekkürler, tam olarak aradığım şey bu! –

2

Sorgularınız için geri arama olarak tüm verilerin var olup olmadığını kontrol eden bir işlev kullanabilirsiniz ve tüm veriler varsa, yanıt gönderilebilir.

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

gibi yani bir şey daha sonra sadece aramaları

her üç cevabınız gönderilecektir tamamlamış
model.getA(function(result){ 
    templateData.A = result; 
    checkData(); 
} 

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

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

iç içe değil.

İlgili konular