2012-02-09 19 views
6

indexedDB tiene un spec diciendo que puede acceder a una base de datos indexada de forma síncrona, pero aún no se ha implementado.¿Cómo puedo acceder indexedDB sincrónicamente?

Me preguntaba si hay una manera para que sea síncrona manualmente,

Mi JavaScript parece a esto,

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

Así se puede poner algo ahí para hacer que esperar hasta que el onSuccess método ha sido llamado antes de continuar?

La razón por la que quiero hacer esto es el código anterior se envuelve dentro de este método,

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

lo que es una capa de mosaico ESRI (que cargará azulejos sobre un mapa en mi página web), y ese método necesita devolver la url directamente para un mosaico en particular. O bien será una URL para cargar la imagen de si no se almacena en la base de datos ya, o esto,

data:image;base64,*BASE64DATA* 

Dónde BASE64DATA son los datos de la base de datos en caché si previamente.

Anteriormente estaba usando localStorage para esto, que funciona sincrónicamente, pero que tiene un límite de 5MB, así que pensé que podría experimentar con indexedDB.

Respuesta

0

IE10 admite la API de sincronización, pero indexeddb sync api solo se puede utilizar dentro de un trabajador web. Si está trabajando en el hilo de la interfaz de usuario, necesita usar la API asíncrona.

La manera más fácil de trabajar con la API asíncrona es a través de promesas.

+0

Por favor [no agregue firmas o eslóganes a sus publicaciones] (http://stackoverflow.com/faq#signatures). – meagar

2

IndexedDB Sync API está marcada como una parte arriesgada de IndexedDB specification y pueden eliminarse debido a la posible falta de implementaciones.

he implementado solución 'sincronización' con el evento de transacción 'onComplete' que garantiza que la acción actual se terminó antes de comenzar la siguiente, y también uso encargo semaphore y queue lógica que maneja las llamadas asíncronas de interfaz gráfica de usuario y asegura que 2 conexiones abiertas hacia la base de datos IndexedDB no ocurrirán al mismo tiempo.

+1

¿El código de lo que describes en esta publicación está disponible en cualquier lugar? – dumbmatter

Cuestiones relacionadas