Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HTML5 Database API : Synchronous request

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

like image 866
grunk Avatar asked Oct 29 '10 13:10

grunk


People also ask

Is XMLHttpRequest synchronous or asynchronous?

XMLHttpRequest supports both synchronous and asynchronous communications. In general, however, asynchronous requests should be preferred to synchronous requests for performance reasons. Synchronous requests block the execution of code which causes "freezing" on the screen and an unresponsive user experience.

What is difference between synchronous and asynchronous request?

Synchronous request — (Default) Where the client blocks and waits for the result of the remote request before continuing execution. Asynchronous request — Where the client continues execution after initiating the request and processes the result whenever the AppServer makes it available.

Is IndexedDB synchronous?

Synchronous and asynchronous Operations performed using IndexedDB are done asynchronously, so as not to block applications.

Is JavaScript synchronous or asynchronous?

JavaScript is Synchronous Spoiler: at its base, JavaScript is a synchronous, blocking, single-threaded language. That just means that only one operation can be in progress at a time.


2 Answers

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);
    }
});
like image 79
bobince Avatar answered Oct 03 '22 06:10

bobince


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.

like image 30
Julien Avatar answered Oct 03 '22 06:10

Julien