Callback And Global Variable

Node js to return global variable set in callback function

ERROR :

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('','');
                html = html.replace('
','); results=html; } };

SOLUTIONS:

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. This is the standard modern way to do this in JavaScript.


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('', '');
        html = html.replace('
', ''); return html; } };

Usage:

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

Or, in an async function:

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
}

Example :

Before Asynchronous :

cal = function (x, y) {
  console.log("x=" + x, "y=" + y);
  let sum = add(x, y);
  console.log("sum = " + sum);
  console.log("End of program")
}

add = function (x, y) {
  return x + y;
}

cal(2, 8)

//Result 
x= 2 y = 8
sum = 10

Undefined Result :


cal = function(x,y)
{
console.log("x=" + x, "y=" + y);
let sum = add(x,y);
console.log("sum = " + sum);
console.log("End of program")
}

add = function(x,y){
setTimeout(function(){
	console.log('Addition performed after 200ms')
	return x+y;
}, 200)

}

cal(2,8)

//Result : 
x =2 y = 8
sum = undefined
End of program
Addition performed after 200ms

Callback Method :

cal = function(x,y)
{
console.log("x=" + x, "y=" + y);
let sum = add(x,y, function(result){
console.log("sum = " + sum);

});
console.log("End of program"); // Executed after callback

}

add = function(x,y, callback){
setTimeout(function(){ // database call, restapi call
	console.log('Addition performed after 200ms')
	callback( x+y);
}, 200)

}

cal(2,8)

Leave a Reply

Your email address will not be published. Required fields are marked *