[英]Node.js asynchronous multiple queries
所以我试图在客户端给定的列表上使用forEach语句获取查询。
提取结果后,将结果放入数组中,这样我就可以将结果检索到客户端(显然是在格式化之后)。
问题是我在mysql上进行了多个异步查询,但我不确定如何解决它们。
var select = function(list, flag, callback){
list.forEach(function(element){
if (flag && (element != '')){
connection.query(sql, function (err, result) {
if (err) {throw err;}
callback(result);
});
} else if (element != ''){
connection.query(sql, function (err, result) {
if (err) {throw err;}
callback(result);
});
}
});
};
我使用以下后期解析方法调用此函数
var results = [];
if (req.body.ip == undefined){
mysql.select(req.body.field1.split('\r\n'), false, function(result){
results.push(result);
});
} else if (req.body.name == undefined){
mysql.select(req.body.field2.split('\r\n'), true, function(result){
results.push(result);
});
}
res.send(results);
我曾尝试过兑现诺言,但由于从未使用过诺言,因此我无法找到适当的结构。
如果有人可以帮我,我将非常感激!
编辑:固定! 我用这个
enter code herevar select = function(list, flag, callback){
var promises = [];
list.forEach(function(element){
if (flag && (element != '')){
promises.push(new Promise(function(resolve, reject){
connection.query(sql, function (err, result) {
if (err) {reject(err);}
resolve(callback(result));
});
}));
} else if (element != ''){
promises.push(new Promise(function(resolve, reject){
connection.query(sql, function (err, result) {
if (err) {reject(err);}
resolve(callback(result));
});
}));
}
});
return promises;
};
然后像这样的主要代码
var results = [];
if (req.body.ip == undefined){
Promise.all(mysql.select(req.body.field1.split('\r\n'), false, function(result){
results.push(result);
})).then(function(){
res.send(results)
});
} else if (req.body.name == undefined){
Promise.all(mysql.select(req.body.field2.split('\r\n'), true, function(result){
results.push(result);
})).then(function(){
res.send(results)
});
}
让我们使用异步功能。 首先,让我们说明promisify
您的回调返回函数:
const util = require("util");
connection.queryAsync = util.promisify(connection.query);
现在,让我们将列表map
为连续的,这样我们就知道它们何时完成了-一个诺言就是一个价值+时间的事物,您可以通过以下方式访问该价值:
现在,在您的实际代码中将函数标记为async
因此,如果它是function foo
则需要是async function foo
,那么我们可以轻松地使用async-await:
async function select(list, flag) {
const relevant = list.filter(x => x != "")
const ps = flag ? list.map(x => connection.queryAsync(x.a))
: list.map(x => connection.queryAsync(x.b)); // or whatever
return await Promise.all(ps);
};
然后,在外面
select([...], ...).then(() => console.log("All done!"));
注意:真正解决问题的方法可能是在SQL端解决的-这需要是单个查询,而不是N个查询,这可能会运行得更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.