【问题标题】:is there a way to avoid set a timeout有没有办法避免设置超时
【发布时间】: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/awaitDeferred 例如 -- 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


【解决方案1】:

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

【讨论】:

  • 好的,我明白了,虽然我需要再次调用它来处理错误...谢谢,它看起来像这样更干净,并且无需额外超时即可工作。
猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2011-09-13
  • 2010-09-17
  • 1970-01-01
  • 2020-06-10
  • 2021-12-15
相关资源
最近更新 更多