2012-08-25 11 views
5

Soy consciente de que IDBObjectStore.getAll is not part of the IndexedDB standard y que . Pero está implementado en Firefox, y hace que su código sea más bonito si tiene que recuperar muchos objetos de la base de datos.IndexedDB getTodo en navegadores que no sean Firefox

¿Sería posible hacer algún tipo de polyfill o algo para permitir que getAll funcione en otros navegadores compatibles con IndexedDB? La funcionalidad real de getAll es simple, pero no sé cómo lidiar con la naturaleza asíncrona de IndexedDB en el contexto de replicar su sintaxis precisa en navegadores que no sean Firefox.

Respuesta

10

He hecho a GitHub repo for a shim to support getAll in other browsers, que parece funcionar bastante bien en Chrome. El código se repite a continuación para la posteridad:

(function() { 
    "use strict"; 

    var Event, getAll, IDBIndex, IDBObjectStore, IDBRequest; 

    IDBObjectStore = window.IDBObjectStore || window.webkitIDBObjectStore || window.mozIDBObjectStore || window.msIDBObjectStore; 
    IDBIndex = window.IDBIndex || window.webkitIDBIndex || window.mozIDBIndex || window.msIDBIndex; 

    if (typeof IDBObjectStore.prototype.getAll !== "undefined" && typeof IDBIndex.prototype.getAll !== "undefined") { 
     return; 
    } 

    // https://github.com/axemclion/IndexedDBShim/blob/gh-pages/src/IDBRequest.js 
    IDBRequest = function() { 
     this.onsuccess = null; 
     this.readyState = "pending"; 
    }; 
    // https://github.com/axemclion/IndexedDBShim/blob/gh-pages/src/Event.js 
    Event = function (type, debug) { 
     return { 
      "type": type, 
      debug: debug, 
      bubbles: false, 
      cancelable: false, 
      eventPhase: 0, 
      timeStamp: new Date() 
     }; 
    }; 

    getAll = function (key) { 
     var request, result; 

     key = typeof key !== "undefined" ? key : null; 

     request = new IDBRequest(); 
     result = []; 

     // this is either an IDBObjectStore or an IDBIndex, depending on the context. 
     this.openCursor(key).onsuccess = function (event) { 
      var cursor, e, target; 

      cursor = event.target.result; 
      if (cursor) { 
       result.push(cursor.value); 
       cursor.continue(); 
      } else { 
       if (typeof request.onsuccess === "function") { 
        e = new Event("success"); 
        e.target = { 
         readyState: "done", 
         result: result 
        }; 
        request.onsuccess(e); 
       } 
      } 
     }; 

     return request; 
    }; 

    if (typeof IDBObjectStore.prototype.getAll === "undefined") { 
     IDBObjectStore.prototype.getAll = getAll; 
    } 
    if (typeof IDBIndex.prototype.getAll === "undefined") { 
     IDBIndex.prototype.getAll = getAll; 
    } 
}()); 
+1

Hola, hablando de 4 años en el futuro; necesitaba tu código para hacerlo funcionar en "Te dejo adivinar primero ..." yessss, Internet Explorer (clap clap) – sergio0983

+1

lol IE/Edge aún están muy atrás. – user1133275

Cuestiones relacionadas