有没有办法避免设置超时

时间:2019-03-26 01:11:30

标签: 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); 
})

1 个答案:

答案 0 :(得分:0)

如果您已经在使用let mem ls ks = match find ls k with None -> false | Some _ -> true ,则可以一路使用它,避免出现“ Promise Hell”(嵌套async/await调用):

.then