2016-03-23 32 views
-1

我有一個sql查詢,我在nodejs與node-mysql庫中執行。Nodejs等待for循環完成mysql查詢

我要上查詢的結果運行一個for循環,像這樣:

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

我嘗試使用異步庫,並把第一功能sql.query(),其餘的我的代碼在第二個函數中,但它等待查詢完成,但不是for循環。

任何人都可以幫忙嗎?

回答

0

嘗試使用異步庫及其each函數。

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

如果您需要密鑰/索引,請改爲使用forEachOf

+0

謝謝,明白了! :) – xcept

0

實際上你的代碼看起來很好,在for循環之後的所有東西都應該在查詢和循環完成後執行。因爲sql.query函數是異步的,所以完整語句後的所有內容都會立即執行。嘗試以下異步執行,它應該工作得很好:

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 
}