javascript - Node js返回回调函数中设置的全局变量

标签 javascript node.js asynchronous callback return

我在 javascript 中有 2 个函数,我想在回调中设置一个全局变量,然后从我的主函数中返回它。我知道 javascript 本质上是异步的,那么最好的方法是什么?我有以下代码:

var results="";

function getData() {

var sql = require("mssql");
var dbConfig={
        server:"server",
        database: "db",
        user:"user",
        password: "pw"
}




        var conn = new sql.Connection(dbConfig);
        var req = new sql.Request(conn);
        conn.connect(function (err){
                if (err) {
                console.log(err);
                return;
                }


                req.query("SELECT * FROM table",resultsCallback)

                conn.close();
        });

    return results;
}

function resultsCallback (err, recordset) {

        var tableify = require('tableify');

        if (err) {
                console.log(err);
        }
        else {

                var html = tableify(recordset);
                html = html.replace('<table>','');
                html = html.replace('</table>',');
                results=html;

        }
};

最佳答案

没有正确的方法来做到这一点,因为你想做的事情是不正确的。您试图在获取值之前返回该值。而且您正在使用全局变量,这对您的代码来说可能是危险的。

我理解为什么您尝试使用全局变量来获取回调结果,但它不起作用。

当您的代码return results;执行时,SQL查询甚至还没有开始,因此它返回""

相反,请使用Promise :

function getData() {
    return new Promise((resolve, reject) => {
        var sql = require("mssql");
        var dbConfig = {
            server: "server",
            database: "db",
            user: "user",
            password: "pw"
        }
        var conn = new sql.Connection(dbConfig);
        var req = new sql.Request(conn);
        conn.connect(function (err) {
            if (err) {
                console.log(err);
                reject(err);
                return;
            }
            req.query("SELECT * FROM table",
                (err, recordset) => {
                    // Here we call the resolve/reject for the promise
                    try {
                        // If the results callback throws exception, it will be caught in 
                        // the catch block
                        resolve(resultsCallback(err, recordset));
                    }
                    catch (e) {
                        reject(e);
                    }
                }
            );

            conn.close();
        });
    })
}

function resultsCallback(err, recordset) {
    var tableify = require('tableify');
    if (err) {
        console.log(err);
        throw err;
    }
    else {
        var html = tableify(recordset);
        html = html.replace('<table>', '');
        html = html.replace('</table>', '');
        return html;
    }
};

全局变量可能很危险,你不需要它们。 promise 解决你的问题。您可以嵌套任意多个回调,但始终使用 resolvePromise 返回值。这是在 JavaScript 中执行此操作的标准现代方法。

用法:

getData().then((data)=>{console.log("Table data:",data);})
         .catch((error)=>{console.log("ERROR LOADING SQL:",error);})

或者,在异步函数中:

async function doSomethingWithData() {
    console.log("Start loading data.");
    const data = await getData();
    console.log("Done loading data.");
    // your results are in the data variable now
}

关于javascript - Node js返回回调函数中设置的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50091811/

相关文章:

javascript - 使用带有react-chartjs-2的chartjs-chart-geo插件实现等值线图

javascript - 在不兼容的接收器nodejs上调用类型错误: Method Uint8Array.长度

node.js - 如何从 Express 将 400 错误的 json 数据返回到 React?

c++ - Boost TCP async_receive_some 不会第二次读取

javascript - 在 Promise 链中抛出不同的错误?

javascript - 如何使用 ES6/7 对 html 元素中的所有文本运行大量正则表达式替换?

javascript - 在 php 中隐藏检查元素

javascript - 如何解决 Node.js UnhandledPromiseRejectionWarning : Unhandled promise rejection: TypeError: Only absolute URLs are supported?

javascript - 如何使用 Puppeteer 求解和定位元素

php - 多次调用一个函数而不等待它完成