Returning from anonymous function passed as parameter

Consider the following code:

function dbTask(q) {
    mysql = new MySQL();
    mysql.host = sqlHost;
    mysql.user = sqlUser;
    mysql.password = sqlPassword;
    mysql.query("USE stock");

    return mysql.query(q, function(err, results, fields) {
        if(err) {
            console.log("MySQL Error: " + err + ", Query: " + q);
            return false;
        } else {
            return results; //here
        }
    });
};

var r = dbTask("SELECT * FROM user;");
console.log(r);

Whereas, I want the results to be returned from the inner anonymous function when calling dbTask() in the second last line, I am getting different output which seems like some internal construct of the mysql library under use.

How can I get dbTask to return the results when called?

Since mysql.query is asynchronous, then you'll have to re-think your architecture.

Instead of having your function return true or false, you'll have to pass in handlers to be called if the query returned true or false.

Something like this:

function dbTask(q, success, failure) {
    mysql = new MySQL();
    mysql.host = sqlHost;
    mysql.user = sqlUser;
    mysql.password = sqlPassword;
    mysql.query("USE stock");

    mysql.query(q, function(err, results, fields) {
        if(err) {
            console.log("MySQL Error: " + err + ", Query: " + q);
            failure(err, results, fields);
        } else {
            success(results, fields);
        }
    });
};

Which you'd call like this:

dbTask(q, 
          function(results, fields) { /* ... */ }, 
          function(err, results, fields) { /* ... */ });

You can't because dbTask returns once the mysql.query call completes to initiate the query. So by the time mysql.query's callback is called, console.log(r) has already executed.

This is the crux of the asynchronous nature of node.js.

What you can do is have dbTask accept a callback parameter that the function calls once results is available so that it can be provided to the caller asynchronously.