我知道这IDBObjectStore.getAll不是 IndexedDB 标准的一部分,而且它可能永远不会是. 但它是在 FireFox 中实现的,如果您必须从数据库中检索大量对象,它会使您的代码更漂亮。
是否有可能制作某种 polyfill 或允许getAll在其他支持 IndexedDB 的浏览器中工作的东西?的实际功能getAll很简单,但我不知道如何处理 IndexedDB 在非 Firefox 浏览器中复制其精确语法的异步特性。
我知道这IDBObjectStore.getAll不是 IndexedDB 标准的一部分,而且它可能永远不会是. 但它是在 FireFox 中实现的,如果您必须从数据库中检索大量对象,它会使您的代码更漂亮。
是否有可能制作某种 polyfill 或允许getAll在其他支持 IndexedDB 的浏览器中工作的东西?的实际功能getAll很简单,但我不知道如何处理 IndexedDB 在非 Firefox 浏览器中复制其精确语法的异步特性。
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;
}
}());