2012-02-09 7 views
6

IndexedDB ha un spec che dice che è possibile accedere ad un database indicizzato in modo sincrono, ma non è ancora stato implementato.Come posso accedere a indexedDB in modo sincrono?

Mi stavo chiedendo se esiste un modo per rendere sincroni manualmente,

mio JavaScript assomiglia a questo,

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) 
    { 
    } 
} 

così si può mettere qualcosa in là per rendere più attendere che l'onSuccess il metodo è stato chiamato prima di continuare?

Il motivo che voglio fare questo è il codice di cui sopra è avvolto all'interno di questo metodo,

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

quindi è un posatore ESRI (che caricherà le piastrelle su una mappa sulla mia pagina web), e quel metodo deve restituire immediatamente l'url per una particolare tessera. Sarà essere un URL per caricare l'immagine da se non è memorizzato nella cache nel database già, o di questo,

data:image;base64,*BASE64DATA* 

Dove BASE64DATA sono i dati dal database, se precedentemente memorizzate nella cache.

In precedenza utilizzavo localStorage per questo, che funziona in modo sincrono, ma che ha un limite di 5 MB, quindi ho pensato di sperimentare con indexedDB.

risposta

0

IE10 supporta la sincronizzazione api, ma la sincronizzazione indexeddb api può essere utilizzata solo all'interno di un web worker. Se stai lavorando nel thread dell'interfaccia utente, devi utilizzare l'API async.

Il modo più semplice per lavorare con l'API asincrona è attraverso le promesse.

+0

Per favore [non aggiungere firme o tagline ai tuoi messaggi] (http://stackoverflow.com/faq#signatures). – meagar

2

IndexedDB Sync API è contrassegnato come una parte rischiosa di IndexedDB specification e potrebbe essere rimosso a causa della potenziale mancanza di implementazioni.

Ho implementato la soluzione di "sincronizzazione" utilizzando l'evento di transazione 'oncomplete' che garantisce che l'azione corrente sia terminata prima di avviare quella successiva e utilizzo anche la logica personalizzata semaphore e queue che gestisce le chiamate asincrone dalla GUI e assicura che 2 connessioni aperte verso il database IndexedDB non si verifichino contemporaneamente.

+1

Il codice per ciò che hai descritto in questo post è disponibile ovunque? – dumbmatter

Problemi correlati