2012-08-25 7 views
5

Ich bin mir bewusst, dass IDBObjectStore.getAll is not part of the IndexedDB standard und . Aber es ist in FireFox implementiert, und es macht Ihren Code hübscher, wenn Sie viele Objekte aus der Datenbank abrufen müssen.IndexedDB getAll in nicht-Firefox-Browsern

Wäre es möglich, eine Art von Polyfill oder etwas zu machen, um getAll in anderen Browsern zu verwenden, die IndexedDB unterstützen? Die eigentliche Funktionalität von getAll ist einfach, aber ich weiß nicht, wie ich mit der asynchronen Natur von IndexedDB im Kontext der Replikation seiner genauen Syntax in Nicht-Firefox-Browsern umgehen soll.

Antwort

10

Ich machte a GitHub repo for a shim to support getAll in other browsers, die in Chrome gut genug zu funktionieren scheint. Der Code wird im Folgenden für die Nachwelt wiederholt:

(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

Hallo, ich spreche von 4 Jahren in der Zukunft; brauchte deinen Code, um es in "Ich lass dich zuerst raten ..." yessss, Internet Explorer (klatschen klatschen) – sergio0983

+1

lol IE/Edge sind immer noch so weit zurück. – user1133275

Verwandte Themen