我正在使用mysql和Node JS开发RESTful API。我将查询包装到定义为select函数的数据库中:
var mysql = require('mysql');
var db = mysql.createConnection({
host : CONFIG.db_host,
user : CONFIG.db_user,
password : CONFIG.db_password,
database : CONFIG.db_name
});
function select(query, callback, out, args)
{
console.log('Sent query: ' + query);
db.query(query, args, function(err, rows){
if(err) throw err;
return callback(rows, out);
});
};
为了在我的应用程序中实现一个功能,我必须对数据库表执行查询,该查询返回不确定的行数(N),并使用在每行中获得的信息来执行N new在另一个表上查询。
类似的东西:
function callback(rows, out){
// just to give the idea ...
for(var i=0; i<rows.length; i++)
{
db.select("SELECT * FROM table WHERE col=?", function(rows, out){
out.push(rows);
}, rows[i].col)
}
// wait for all queries ...
console.log(out)
}
out = []
db.select("SELECT * FROM table WHERE col=?", callback, out, col)
异步运行所有查询没有问题,但是在返回API响应之前,我必须等待所有查询结束。我认为使用Promises可能是一种方法,但是由于查询数量不确定,所以我不知道如何实现它。你能帮我吗?
答案 0 :(得分:2)
您的主要问题是2
循环。使用它意味着您正在混合同步和异步代码。
如果需要使用回调模式,建议您也使用外部库,例如async,这样可以更轻松地使用异步迭代模式。像下面这样的东西可能会解决问题:
for
如果您想改用Promise,则mysql2软件包提供与mysql类似的API,但支持promises。使用基于var async = require('async');
conn.query('SELECT * FROM table WHERE col=?', col, function (err, rows) {
async.each(rows, function (row, callback) {
conn.query('SELECT * FROM other_table WHERE col=?', row.col, callback);
}, function () {
// all queries are done
})
});
的API的有趣之处在于,您可以随后使用Promise
(在Node.js async/await
上),如果您不喜欢,则可以使您的生活更加轻松常规JavaScript代码的异步性质。
因此,就您而言,您将可以执行以下操作:
>= 7.6