I'm new to Javascript and trying to write a firefox add-on.
I am trying to pass/ extract the data returned from a SQL query to the calling function.
It doesn't seem to work.
I searched info on variable scope, looked at any relevant post I coulld see on this site, and tried examples that were said to work, but none works for me.
I am using the storage info from:
https://developer.mozilla.org/en/Storage
https://developer.mozilla.org/en/mozIStorageStatement
What do I do wrong, or how should I do this?
I am running firefox 12 on xp.
function Sqlite() {
this.dbConn = "";
this.empty = true;
}
Sqlite.prototype.retrieveData = function(query)
{
var rows = new Array(); // to be returned to the calling function
var stmt = this.dbConn.createStatement(query); // my "select..." statement
stmt.executeAsync ({
handleResult: function(aResultSet)
{
this.empty = false;
var i = 0;
for (let row; row = aResultSet.getNextRow();i++) {
rows[i] = row;
}
},
handleError: function(anError) {
//some code
},
handleCompletion: function(aReason) {
if (this.empty) {
// CODE FOR WHEN STATEMENT EXECUTION IS FINISHED
}
if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) {
document.getElementById("debug").value = rows[0]; //gets the data from the query: [xpconnect wrapped mozIStorageRow]
return true;
}
}
});
document.getElementById("debug").value = rows[0]; //gets undefined
stmt.finalize();
return rows; // the info is no longer available at this point.
}
I'll really appreciate your help
You're somehow vague in the way you're describing your problem, but when you write:
return rows; // the info is no longer available at this point.
this is of course expected. executeAsync
, as the name implies, is asynchronous. That means that when you call executeAsync
, the action is scheduled for later. Javascript has a run-to-completion semantics, so the execution will continue until the return rows
statement is reached. At this point, the query has not been executed yet! Once your function is finished, the JS engine will execute your asynchronous statement and your handleCompletion
callback will be called. It is then up to the code in handleCompletion
to do whatever you want with the data, e.g. call another function to do something with it.
Also, your empty
variable seems unneeded.
handleCompletion: function(aReason) {
if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) {
// something went wrong
} else {
// do something useful with rows
}
},
Finally, you need to call row.getResultByName
to get the value of a column in the row.