首页 > 解决方案 > 将 MySQL 查询结果捕获为 var [js]

问题描述

我目前正在尝试构建一个不和谐的机器人,并且我想在它的某些方面使用数据库。目前,我正在尝试添加一个命令,该命令将返回我在数据库中拥有的所有表的名称,并且在大多数情况下我已经将其关闭。

我正在努力解决的部分实际上是将名称作为 var 重新显示。我能够在其上找到的每个指南和 stackoverflow 问题都假定您只想获得该结果然后将其打印到控制台,但我需要将其返回给调用它的方法。

我之前的尝试是设置一个外部变量并使用一个 Promise 来等待它改变,但我无法让它工作,很可能是因为我不完全理解 Promises 是如何工作的。我当前的尝试用于setTimeout()检查,但这只是返回第一次或第二次迭代的 asyncID。

非常欢迎任何帮助来完成这些工作或完全废弃它们并以不同的方式做这件事。

以前的代码:

function listTables() {
    db.query('SELECT table_name FROM information_schema.tables WHERE table_schema=\'' + dbName + '\'', (error, results) => {
        if(error) throw error;
        let temp = '';
        results.forEach((item) => {
            temp += item.table_name + ', ';
        }); temp = temp.slice(0, -2);
        setReturn(temp);
    });
    
    let out = checkReturn().then((value) => {
        return value();
    }).catch((error) => {
        console.log(error);
        return '';
    });
    returnValue = null;
    return out;
}



var returnValue = null;
function setReturn(value) {
    returnValue = value;
}
async function checkReturn() {
    console.log('Checking Return: ' + returnValue);
    let promise = new Promise((resolve, reject) => {
        if(returnValue === null) reject('Var not set');
        else resolve(returnValue)
    });
    return await promise;
}

当前代码:

function listTables() {
    setReturn(null);
    db.query('SELECT table_name FROM information_schema.tables WHERE table_schema=\'' + dbName + '\'', (error, results) => {
        if(error) throw error;
        let temp = '';
        results.forEach((item) => {
            temp += item.table_name + ', ';
        }); temp = temp.slice(0, -2);
        setReturn(temp);
    });
    return checkReturn();
}



var returnValue = null;
function setReturn(value) {
    returnValue = value;
}
function checkReturn() {
    console.log('Checking Return: ' + returnValue);
    if(returnValue === null) {
        return setTimeout(checkReturn, 50);
    } else {
        return returnValue;
    }
}

标签: javascriptmysqlnode.js

解决方案


您需要修改该listTables函数以返回一个承诺。

function listTables() {
    return new Promise((resolve, reject) => {
        db.query('SELECT table_name FROM information_schema.tables WHERE table_schema=\'' + dbName + '\'', (error, results) => {
            if(error) {
                reject(error);
                return;
            }
            let temp = '';
            results.forEach((item) => {
                temp += item.table_name + ', ';
            }); temp = temp.slice(0, -2);
            resolve(temp);
        });
    });
}

// Usage of `listTables()`
listTables()
    .then(result -> {
        // Do process result
    });

推荐阅读