2016-03-23 19 views
-1

Düğüm-mysql kitaplığı ile nodejs içinde yürüttüğüm bir sql sorgum var.Nodejs mysql sorgusuyla bitecek bir döngü için bekle

böyle, sorgunun sonucu döngü için çalıştırmak istiyorum:

sql.query(query, function(err, rows, field){ 
if (err) throw err; 
for(var i = 0; i < rows.length; i++) { 
    do_something_complicated(); 
} 
} 

ben zaman uyumsuz kitaplığı kullanarak çalıştı ve ilk fonksiyonunda sql.query() ve geri kalanı arasında koymak kodum ikinci işlevde ancak sorguyu bitirmeyi bekler, ancak döngü için değil.

Herkes yardımcı olabilir mi?

cevap

0

Async kitaplığını ve each işlevini kullanmayı deneyin.

sql.query(query, function(err, rows, field) { 
    if (err) throw err; 
    async.each(rows, function(row, callback) { 
     do_something_complicated(); 
     // once finished call the callback 
     // no arguments or null if successful, else with the error 
     callback(); 
    }, function(err) { 
     // handle errors and do something after each row has been iterated 
    } 
} 

yerine anahtar/index kullanımı forEachOf gerekir.

+0

Teşekkürler, anladım! :) – xcept

0

Aslında kodunuz gayet iyi görünüyor, her şeyden sonra for döngüsü döngüden sonra her şey gerçekleştirildikten sonra, sorgu ve döngü tamamlandıktan sonra. Sql.query işlevi eşzamansız olduğundan, tam ifadeniz bittikten hemen sonra hemen uygulanır. Async bir deneyin ile aşağıdaki uygulamayı verin, bu sadece iyi çalışması gerekir:

async.waterfall([ 
    async.apply(sql.query, query), 
    function(rows, field, callback){ 
     for(var i = 0; i < rows.length; i++) { 
      do_something_complicated(); 
     } 

     callback(null); // This is important, call callback after you are done with everything and pass null for the error parameter 
    } 
], 
function(err){ 
    if(err) throw err; 

    // Everything is executed by now 
}