【发布时间】:2019-03-26 01:11:29
【问题描述】:
我正在尝试从 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或Deferred例如 --return new Promise(function(resolve, reject) { doSomething(function cb(good) { if (good) resolve(); else reject(); }); });Ref: developer.mozilla.org/en-US/docs/Mozilla/… -
我想我一定是在某个地方弄错了......我已经在使用 async/await 但是对于这个特定的请求,我需要在我的 module.export 中添加额外的超时,我不明白为什么。这是我的函数 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); }) -
@Rai,谢谢。我在正文问题中添加了函数示例
标签: node.js