- From: Jonas Sicking <jonas@sicking.cc>
- Date: Thu, 15 Jul 2010 13:52:54 -0700
- To: "victor.hong@nokia.com" <victor.hong@nokia.com>
- Cc: "public-webapps@w3.org" <public-webapps@w3.org>
On Thursday, July 15, 2010, <victor.hong@nokia.com> wrote:
>
>
>
> On 7/15/10 1:50 PM, "ext Jonas Sicking" <jonas@sicking.cc> wrote:
>
>> On Thu, Jul 15, 2010 at 8:13 AM, <victor.hong@nokia.com> wrote:
>>> Hi,
>>>
>>> I would like to get some clarification on async implementation of the
>>> indexedDB API.
>>>
>>> Example 1:
>>> Below is a sample code from the following blog article.
>>> http://hacks.mozilla.org/2010/06/comparing-indexeddb-and-webdatabase/
>>>
>>> var request = window.indexedDB.open("CandyDB",
>>> "My candy store database");
>>> request.onsuccess = function(event) {
>>> var db = event.result;
>>> if (db.version != "1") {
>>> // User's first visit, initialize database.
>>> var createdObjectStoreCount = 0;
>>> var objectStores = [
>>> { name: "kids", keyPath: "id", autoIncrement: true },
>>> { name: "candy", keyPath: "id", autoIncrement: true },
>>> { name: "candySales", keyPath: "", autoIncrement: true }
>>> ];
>>>
>>> function objectStoreCreated(event) {
>>> if (++createdObjectStoreCount == objectStores.length) {
>>> db.setVersion("1").onsuccess = function(event) {
>>> loadData(db);
>>> };
>>> }
>>> }
>>>
>>> for (var index = 0; index < objectStores.length; index++) {
>>> var params = objectStores[index];
>>> request = db.createObjectStore(params.name, params.keyPath,
>>> params.autoIncrement);
>>> request.onsuccess = objectStoreCreated;
>>> }
>>> }
>>> else {
>>> // User has been here before, no initialization required.
>>> loadData(db);
>>> }
>>> };
>>>
>>> In this code, request is returned from request = window.indexedDB.open()
>>> call, then request.onsuccess = function() {...} is assigned.
>>>
>>> Maybe I don't fully understand how this IndexedDB works,
>>> it seems that there could be a race condition between the open() operation
>>> and request.onsuccess assignment. The open() operation could be completed
>>> before request.onsuccess got assigned to a callback function. Does this mean
>>> that the request.onsuccess callback function will not be called?
>>
>> No.
>>
>> Since the 'success' event fires asynchronously, it will never fire
>> until you've returned to the main event loop. In other words, while we
>> might actually finish the request before .onsuccess gets called, all
>> that is done when the request is finished is to post an "task" to the
>> main event loop. Only once this "task" runs, the 'success' event is
>> fired. Thus you have lots of time to set the .onsuccess property
>> before the event could possibly fire. This is not specific to
>> IndexedDB, there are lots of specifications that work this way.
>> Consider the following similar code:
>>
>> xhr = new XMLHttpRequest();
>> xhr.open(...);
>> xhr.send(...);
>> xhr.onload = myHandler;
>>
>> This is completely safe. While we might finish loading the resource
>> before .onload is set (for example if we're loading from cache), the
>> 'load' event can only be fired after we've returned to the main event
>> loop.
>
>
> So you mean by the time control return to the main event loop of the
> browser, request.onsuccess= mycallback would have been executed, even
> though
> the request has been finished but it only post a "task" to the main event
> loop
> waiting to be fired.
Yes.
/ Jonas
Received on Thursday, 15 July 2010 20:53:27 UTC