JamesG
JamesG

Reputation: 2018

Accessing nested functions in Javascript

I have the following code:

function getRetailerName(retailerID) {
    var retailerName;
    db.transaction(function retName(qry) {
        qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) {
            var len1 = results1.rows.length;
            var retailerName;
            for (var i1 = 0; i1 < len1; i1++) {
                retailerName = results1.rows.item(i1).retailerName;
                //alert(results1.rows.item(i1).retailerName);
            }
        });
        return retailerName;
    });
    alert(retName());
}

I am trying to get the value from the inner function retName() and ultimately call getRetailerName() to get the value from the database, however it keeps giving me an error that retName is not defined?

I have tried a lot here,

Upvotes: 1

Views: 118

Answers (2)

Bergi
Bergi

Reputation: 665574

You cannot (since the retName named function expression is only available inside it) and You should not try to do this (since the functions are asynchronous and it wouldn't work). Instead, use callbacks:

function getRetailerName(retailerID, callback) {
    var retailerName;
    db.transaction(function retName(qry) {
        qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) {
            var len1 = results1.rows.length;
            for (var i1 = 0; i1 < len1; i1++) {;
                callback(results1.rows.item(i1).retailerName);
            }
        });
    });
}

getRetailerName(1, alert.bind(window));

Upvotes: 1

Evan Trimboli
Evan Trimboli

Reputation: 30092

You can't do it like that because it's asynchronous. By the time you return from the function the query hasn't completed. Instead, pass a callback to be executed:

function getRetailerName(retailerID, callback) {
    var retailerName;
    db.transaction(function retName(qry) {
        qry.executeSql("SELECT retailerName FROM retailers WHERE token = '" + retailerID + "' ", [], function (tx, results1) {
            var len1 = results1.rows.length;
            var retailerName;
            for (var i1 = 0; i1 < len1; i1++) {
                retailerName = results1.rows.item(i1).retailerName;
                callback(retailerName);
            }
        });
    });
}

getRetailerName(1, function(name) {
    alert(name);
});

Upvotes: 3

Related Questions