我知道这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;
}
}());