非Firefox浏览器中的IndexedDB getAll

IndexedDB getAll in non-Firefox browsers

本文关键字:IndexedDB getAll Firefox 浏览器      更新时间:2023-09-26

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

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

我为一个垫片制作了一个GitHub repo,以在其他浏览器中支持getAll,这在Chrome中似乎足够好。代码重复如下以供后人使用:

(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;
    }
}());