5

我知道这IDBObjectStore.getAll不是 IndexedDB 标准的一部分,而且它可能永远不会是. 但它是在 FireFox 中实现的,如果您必须从数据库中检索大量对象,它会使您的代码更漂亮。

是否有可能制作某种 polyfill 或允许getAll在其他支持 IndexedDB 的浏览器中工作的东西?的实际功能getAll很简单,但我不知道如何处理 IndexedDB 在非 Firefox 浏览器中复制其精确语法的异步特性。

4

1 回答 1

12

I made a GitHub repo for a shim to support getAll in other browsers, which seems to work well enough in Chrome. The code is repeated below for posterity:

(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;
    }
}());
于 2012-08-26T14:48:05.177 回答