Nodejs 等待 for 循环完成 mysql 查询
Nodejs wait for a for loop to finish with mysql query
我有一个 sql 查询,我在 nodejs 中使用 node-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 循环。
有人可以帮忙吗?
尝试使用异步库及其 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
}
}
如果您需要 key/index,请改用 forEachOf
。
实际上您的代码看起来不错,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
}
我有一个 sql 查询,我在 nodejs 中使用 node-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 循环。
有人可以帮忙吗?
尝试使用异步库及其 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
}
}
如果您需要 key/index,请改用 forEachOf
。
实际上您的代码看起来不错,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
}