node.js - 有没有办法避免设置超时
问题描述
我正在尝试从 mysql 表中收集所有值,其中包含表中每个索引的 referenced_table_name 的所有值。如何避免在等待承诺时设置随机超时
要收集预期的信息,我需要设置一个随机超时,否则我的对象是未定义的......
module.exports = {
getTable: async (req, res) => {
const tablename = req.params.table,
dbName = req.params.dbName;
let jsonResult = {};
getTableValues(dbName, tablename)
.then(tableValues => {
getTableIndexedCol(dbName, tablename)
.then(indexedColumns => {
let indexedArr = {};
for (let index = 0; index < indexedColumns.length; index++) {
const element = indexedColumns[index],
column = element.column_name,
referencedTable = element.referenced_table_name;
let allValuesRefTable = new Array();
getTableValues(dbName, referencedTable)
.then(referencedTableValues => {
for (let i = 0; i < referencedTableValues.length; i++) {
const el = referencedTableValues[i];
allValuesRefTable.push(el.name);
}
})
.catch(err => console.log(err));
/*IF NO TIMEOUT DOESN'T WORK*/
setTimeout(function(){
indexedArr[column] = allValuesRefTable;
}, 100);
}
setTimeout(function(){
jsonResult = {
name: tablename,
rows : tableValues,
rowIndexed : indexedArr
}
res.json(jsonResult);
}, 5000);
})
.catch(err => console.log(err));
})
.catch(err => console.log(err));
}
};
有没有办法不使用 setTimeout?或者我怎样才能“等待”承诺得到解决?
这是我的功能getTableIndexedCol
,例如:
async function getTableIndexedCol(dbName, tablename) {
const sqlRefTable = SELECT...;
return new Promise (async function(resolve, reject){
try{
[refTable, refTableFields] = await promisePool.query(sqlRefTable)
}
catch(err){
reject(err)
}
setTimeout(function () {
resolve(refTable);
}, 500);
})
解决方案
如果您已经在使用async/await
,则可以一直使用它并避免“Promise Hell”(嵌套.then
调用):
module.exports = {
getTable: async (req, res) => {
try {
const tablename = req.params.table,
dbName = req.params.dbName;
const tableValues = await getTableValues(dbName, tablename);
const indexedColumns = await getTableIndexedCol(dbName, tablename);
let indexedArr = {};
for (let index = 0; index < indexedColumns.length; index++) {
const element = indexedColumns[index],
column = element.column_name,
referencedTable = element.referenced_table_name;
let allValuesRefTable = new Array();
const referencedTableValues = await getTableValues(dbName, referencedTable);
for (let i = 0; i < referencedTableValues.length; i++) {
const el = referencedTableValues[i];
allValuesRefTable.push(el.name);
}
indexedArr[column] = allValuesRefTable;
}
const = jsonResult = {
name: tablename,
rows: tableValues,
rowIndexed: indexedArr
}
res.json(jsonResult);
} catch (err) {
console.log(err);
}
}
};
推荐阅读
- c# - 我想在 asp.net 中向 gridview 添加垂直滚动条
- sql-server - 同一业务规则的多个外键
- highcharts - Highcharts 地图在调用 setData 时未绘制气泡
- javascript - 如何将输入数据与跨度文本绑定?
- python - 如何在 Python 中重塑这个 DataFrame?
- python - 将分类模型用于对象检测框架
- python - for 循环的问题 - Pandas
- reactjs - 服务器端渲染 - 在 css 包之间切换
- javascript - 转换旋转的 Firefox 抽搐问题
- angular - Angular 6 Reactive Form添加错误类容器Div