2012-02-09 16 views
6

IndeksedDB ma spec, mówiąc, że można uzyskać dostęp do indeksowanej bazy danych synchronicznie, ale nie została jeszcze zaimplementowana.Jak mogę uzyskać dostęp do indexedDB synchronicznie?

Zastanawiam się, czy istnieje sposób, aby to synchroniczny ręcznie,

Moja JavaScript wygląda na to,

var trans = databaseAsync.transaction(["mapTile"], IDBTransaction.READ_WRITE); 
var store = trans.objectStore("mapTile"); 
var keyRange = IDBKeyRange.bound(evt.data[0], evt.data[0]); 
var cursorRequest = store.openCursor(keyRange); 

// can you put some kind of wait in here? 

cursorRequest.onsuccess = function(e) 
{ 
    var result = e.target.result; 
    if(!!result == false) 
    { 
    } 
} 

Więc można umieścić coś tam zrobić to czekać, aż onSuccess metoda została wywołana przed kontynuowaniem?

powód, dla którego chcę zrobić to powyższy kod jest owinięty wewnątrz tej metody,

dojo.extend(esri.layers.ArcGISTiledMapServiceLayer, { 
     getTileUrl : function(level, row, col) 
     { 
      // blah 
      return url; 
     } 

Więc jest to warstwa płytki ESRI (która załaduje płytek na mapie na mojej stronie internetowej), i ta metoda musi natychmiast odesłać adres URL dla konkretnego kafelka. Będzie ona być albo URL załadować obrazu z, jeśli nie jest buforowane w bazie już, czy to,

data:image;base64,*BASE64DATA* 

Gdzie BASE64DATA to dane z bazy danych, jeśli wcześniej buforowane.

Poprzednio używałem localStorage do tego, który działa synchronicznie, ale ma limit 5 MB, więc pomyślałem, że będę eksperymentował z indexedDB.

Odpowiedz

0

IE10 obsługuje api synchronizacji, ale aplet synchronizacji indexeddb może być używany tylko wewnątrz pracownika sieci. Jeśli pracujesz w wątku UI, musisz użyć async API.

Najprostszym sposobem na pracę z interfejsem API async jest dotrzymywanie obietnic.

+0

Proszę [nie dodawaj podpisów ani sloganów do swoich postów] (http://stackoverflow.com/faq#signatures). – meagar

2

Interfejs API IndexedDB Sync został oznaczony jako ryzykowny element zestawu IndexedDB specification i może zostać usunięty z powodu potencjalnego braku implementacji.

I zostały wdrożone rozwiązanie synchronizację przy użyciu „onComplete” zdarzenie transakcji, która gwarantuje, że obecna akcja jest zakończona przed rozpoczęciem następnego, i ja też użyć niestandardowego semaphore i queue logikę, która obsługuje połączenia z GUI i async zapewnia, że ​​2 otwarte połączenia z bazą danych IndexedDB nie będą miały miejsca w tym samym czasie.

+1

Czy kod tego, co opisano w tym poście, jest dostępny w dowolnym miejscu? – dumbmatter

Powiązane problemy