简体   繁体   English

节点js返回在回调函数中设置的全局变量

[英]node js to return global variable set in callback function

I have 2 functions in javascript and I want to set a global variable in a callback and then return it from my main function. 我在javascript有2个函数,我想在回调中设置全局变量,然后从主函数返回它。 I know javascript is async by nature so what would be the best way to do this? 我知道javascript本质上是异步的,那么执行此操作的最佳方法是什么? I have the code below: 我有下面的代码:

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;

        }
};

There is no right way to do this, because what you want to do is not right. 没有正确的方法来执行此操作,因为您要执行的操作不正确。 You are trying to return a value before it was fetched. 您试图在获取值之前返回一个值。 And you are using global variable, which can be dangerous for your code. 而且您正在使用全局变量,这对于您的代码可能是危险的。

I understand why you are trying to use global variable to get the results from your callback, but it can't work. 我了解您为什么要尝试使用全局变量从回调中获取结果,但是它不起作用。

When your code return results; 当代码return results; executes, the SQL query has not even started, so it returns "" . 执行时,SQL查询甚至尚未启动,因此它返回""

Instead, use Promise : 而是使用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;
    }
};

Global variables can be dangerous, you don't need them. 全局变量可能很危险,您不需要它们。 Promise solves your problem. 承诺解决您的问题。 You can have as many callbacks nested, but you always return value from Promise using resolve . 您可以嵌套许多回调,但是您始终使用resolvePromise返回值。 This is the standard modern way to do this in JavaScript. 这是在JavaScript中执行此操作的标准现代方法。

Usage: 用法:

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

Or, in an async function: 或者,在async函数中:

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM