Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to wait till callback function returns?

I'm making an android application using phonegap. I'm using phonegap's Storage api for querying a database. here's my code:

function directPath(src, dest)
{
    var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
    db.transaction(queryDB, errorCB);
    return arrayroute;
}

function queryDB(tx)
{
    tx.executeSql(query, [], querySuccess, errorCB);
}

function querySuccess(tx,results) {
    //Write some code here.
}

function errorCB(err) {
    alert("Error in SQL: " + err);
}

The problem is I want to wait till the callback method querySuccess finishes execution before returning from the directPath method.

like image 211
coders1290 Avatar asked Jan 17 '23 23:01

coders1290


2 Answers

Don't try to fight the asynchrony: Your app might end up seeming unresponsive to the user. Use the querySuccess callback for any code that has to be executed afterwards.

like image 159
allesmi Avatar answered Jan 22 '23 02:01

allesmi


I wrote a function to solve a similar problem, you can call it like this:

database("SELECT * FROM USER", function(result){
    console.log(result);
});

//FUNCTION
function database(sql, callback) {

    if(!callback) { callback = function(r) { console.log(r); } }

    var database_name = "Database",
        database_version = "1.0",
        database_displayname = "DatabaseName",
        database_size = 1000000,
        result = {
            error: -1,
            message: "",
            len: 0,
            rows: {}
        },
        db = window.openDatabase(database_name, database_version, database_displayname, database_size);
        db.transaction(
                        function (tx) {
                            tx.executeSql(sql, [], querySuccess, errorCB);
                        }, function (tx, results) {
                            //SUCCESS
                        }, function (err) {
                            //ERROR
                        }
        );
        function querySuccess(tx, results) {
            if (results) {
                result.len = results.rows.length;
                result.message = "Success";
                for (var i=0; i<result.len; i++){
                    result.rows[i] = results.rows.item(i);
                }
            } else {
                result.len = 0;   
            }
            callback( result );
        }
        function errorCB(err) {
            result.error = err.code;
            result.message = err.message;
            callback( result );
        }
}
like image 30
Miguel Alves Avatar answered Jan 22 '23 02:01

Miguel Alves