所以我试图在客户端给出的列表上使用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)
});
}
答案 0 :(得分:0)
让我们使用异步功能。首先,让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个查询,这些查询可能会运行得更快。