7

i currently use the client side database on an html5 iphone webapp. In my code i need to check if a row is present in the local DB :

function isStarted(oDB) {
 var ret = null;
 oDB.query(sql,params,function(transaction,result) {
    if(result.rows.length > 0 ) {
        ret = true;
    } else {
        ret = false;
    }
 });

return ret;

}

Unfortunately the return of isStarted() occurs before the callback function and i always get a "null" value. In the W3c spec we can see an "synchronous-database-api" but how can i use it ? Is there a trick to get the good "ret" value with asynchronus requets ?

Thanks for your help

1
  • I like this question. It states the problem very well. Commented Oct 12, 2011 at 18:58

3 Answers 3

8

To get an object implementing DatabaseSync you have to call openDatabaseSync(...) instead of openDatabase(...). I don't know about the iPhone, or what the oDB object you have is, but according to spec you only get the openDatabaseSync method in a WebWorker and not in the normal web browser window. Certainly XMLHttpRequest has demonstrated that potentially-length synchronous operations in the UI thread are not a good idea.

It's not possible to run asynchronous code synchronously, or vice versa. To do so you'd need language-level features like threads or co-routines that JavaScript doesn't have. You have to exit your functions and return control to the browser to allow it to perform the HTTP request or database query, and call you back on the handler function you gave it.

So you will have to rewrite your code ‘inside-out’ to pass callback functions instead of expecting return values, every time you do something involving database IO.

function tellMeWhenIsStarted(oDB, callback) {
    oDB.query(sql,params,function(transaction,result) {
        callback(result.rows.length>0);
    }
});
Sign up to request clarification or add additional context in comments.

1 Comment

Are you returning callback, or calling it?
8

I am the only one to find this asynchronous request ridiculous ? More over, it seems that Safari implements only the asynchronous model right now... I wonder how we efficiently code like that...

I would enjoy any link to serious programing with the async db driver.

Comments

-1

You have to block the next execution when you intend to retrieve the results synchronously, The price you have to pay is the UI getting blocked during the execution.

var ret = null;
var finished = false;

cfunction isStarted(oDB) {
         oDB.query(sql,params,function(transaction,result) {
                ret = result;
                finished = true;
         });

    while(!finished){
    ;//block next execution, while result is being fetched
    }
    return ret;
}

1 Comment

This seems not to work, at least in Chromium 17.0.963.56. It's also what i would expect, since JS doesnt really have Threads, an so, not only the UI is blocked during the while-loop, but the actual fetching, too.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.