node.js - Node js 承诺异步/等待
问题描述
我已经在 express 中定义了一个应该包含多个 sql 查询的路由,但我不知道如何使用 promises 和/或 async/await 来构造它。
Sql 查询 A 返回 sql 查询 B 中所需的 id。 Sql 查询 B 依次返回三个字符串作为 sql 查询 C 中所需的数组。 Sql 查询 C 包含一个循环,该循环使用数组中的每个字符串一次. 在此循环中,还有 if/else 条件将返回值分配给特定变量。
这些是我孤立的查询:
一个
connection.query('SELECT ID FROM Config WHERE ConfigID = ?', configid, function (error, result, fields) {
if (error) throw error;
else{
id = result[0].ID;
}
});
乙
connection.query('SELECT Var1, Var2, Var3 FROM Config2 WHERE ID = ?', id, function (error, result, fields){
if (error) throw error;
else {
var varArray = [];
varArray.push(result[0].Var1, result[0].Var2, result[0].Var3);
}
});
C
for (i = 0; i < varArray.length; i++){
var selectedVar = varArray[i];
connection.query('SELECT Value FROM Config3 WHERE ConfigID = ? AND VarName = ? ORDER BY Timestmp DESC LIMIT 1', [configid, selectedVar], function (error, result, fields) {
if (error) throw error;
else if (i == 0){
aaa = parseInt(result[0].Value);
} else if (i == 1){
bbb = parseInt(result[0].Value);
} else if (i == 2){
ccc = parseInt(result[0].Value);
}
});
}
configid 是预定义的,所以不要怀疑它来自哪里。A、B 和 C 必须以按顺序执行的方式连接。
然后是另一个查询 D,它不需要任何先前的值(预定义的 configid 除外),因此它可以在其他查询完成之前执行。
D
connection.query('SELECT Number FROM Config WHERE ConfigID = ?', configid, function (error, result, fields) {
if (error) throw error;
else{
ddd = parseInt(result[0].Number);
}
});
完成所有查询并分配相应的值后,我想将它们写入存储所有数据的新数组中:
data = [];
data[0]= aaa;
data[1]= bbb;
data[2]= ccc;
data[3]= ddd;
我如何以我描述的方式连接所有这些查询?我已经阅读了几篇关于 Promise 和 async/await 的文章,但我正在努力将其应用于我的具体问题。
解决方案
如果我是你,我会承诺这样的connection.query
功能。
function runQuery(sql, configid) {
return new Promise((resolve, reject) => {
connection.query(sql, configid, function (error, result, fields) {
if (error) reject(error);
else {
resolve(result);
}
});
});
}
然后我会使用新runQuery
函数来执行 SQL 查询。例如:
app.get('/', async (req, res, next) => {
try {
const result1 = await runQuery('SELECT ID FROM Config WHERE ConfigID = ?', configid);
const id = result1[0].ID;
const resutl2 = await runQuery('SELECT Var1, Var2, Var3 FROM Config2 WHERE ID = ?', id);
// ... and so on
res.send('Done with it');
} catch (error) {
next(error); // Pass the error the express error handler
}
});
希望能帮助到你。
推荐阅读
- mysql - SpringBoot/Hibernate 尽快发现DB差异
- python - BeagleBone Green Wireless 上 PWM 的大量设置时间
- python - 使用 SpaCy 和 Python 创建基于规则的匹配以检测地址
- go - 从 http.ResponseWritter 中提取数据
- python - 如何使用 Python 获取不匹配的列名
- javascript - 为什么这两个相同的基准在同一个浏览器但在两个不同的平台上会有不同的结果?
- ravendb - 在 RavenDB 4.0+ 中按条件对嵌套数组使用 RQL 过滤文档
- join - 雪花的多项选择需要年龄
- python - 在 tkinter 的“Toplevel”透明窗口中创建具有黑色背景的非透明矩形
- java - 弹簧 | 处理大json | jvm内存不足