首页 > 解决方案 > 有没有办法避免设置超时

问题描述

我正在尝试从 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); 
})

标签: node.js

解决方案


如果您已经在使用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);
        }
    }
};

推荐阅读