- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Mon, 22 Apr 2013 09:47:00 -0700
- To: Michaël Rouges <michael.rouges@gmail.com>
- Cc: public-webapps <public-webapps@w3.org>
On Mon, Apr 22, 2013 at 9:43 AM, Michaël Rouges <michael.rouges@gmail.com> wrote: > Hello everyone, > > I'm surprised by how events are added to IndexedDB objects. > > For example, base, opening a database: > > var request; > request = indexedDB.open('database'); > request.onsuccess = function () {}; > request.onupgradeneeded = function () {}; > request.onerror = function () {}; > > As you can see, the events are added after the query execution. > > It does not seem natural and can cause stability problems. > > Indeed, if the application had to be completed by the addition of events, > they will never be triggered. Events don't fire until the next tick. As long as you don't spin the event loop, there's no race conditions and everything's fine. > Here is an example generates an error: > > var request; > request = indexedDB.open('database'); > setTimeout(function () { > request.onsuccess = function () {}; > request.onupgradeneeded = function () {}; > request.onerror = function () {}; > }, 1500); This... is precisely the sort of thing that you shouldn't do. Just don't do this, and you're golden. > In my view, any item requiring events should be set first, then we add the > events and finally, we execute it. > > The code should look like this: > > var request; > request = indexedDB.open('database'); > request.onsuccess = function () {}; > request.onupgradeneeded = function () {}; > request.onerror = function () {}; > request.execute(); The "request.execute()" is more or less implied by hitting the bottom of your function, when it returns control back to the browsers. ~TJ
Received on Monday, 22 April 2013 16:47:47 UTC