如何通过Promise获取IndexedDB的键值对完整数据?
解决IndexedDB获取键值对与降序排序问题
高效获取键值对
IndexedDB没有直接返回键值对的API,但无需逐个遍历查询——你可以通过**并行调用getAll()和getAllKeys()**再合并结果的方式实现,只需要两次批量请求,效率远高于循环查库。
封装示例:
async function getAllKeyValues(objectStore) { // 并行获取所有值和所有键 const [values, keys] = await Promise.all([ objectStore.getAll(), objectStore.getAllKeys() ]); // 合并成键值对数组 return keys.map((key, idx) => ({ key, value: values[idx] })); }
这个方法利用Promise的并行执行特性,一次性拿到所有数据,避免了多次数据库IO操作。
实现降序排序
IndexedDB的排序依赖索引(Index),无法像SQL那样直接写ORDER BY,但可以通过创建带排序规则的索引或指定游标方向来实现高效降序:
1. 按非主键字段降序
首先在数据库升级时,为目标字段创建降序索引:
// 数据库版本升级逻辑 function upgradeDatabase(db) { const store = db.createObjectStore('yourStore', { keyPath: 'id' }); // 创建索引,direction设为'desc'表示降序 store.createIndex('byCreatedAt', 'createdAt', { unique: false, direction: 'desc' }); }
查询时直接使用该索引获取数据,结果已按指定字段降序排列:
async function getSortedEntries(objectStore) { const index = objectStore.index('byCreatedAt'); // 从索引获取所有降序排列的数据 return index.getAll(); }
如果需要同时获取键和排序后的值,同样用并行请求合并:
async function getSortedKeyValues(objectStore) { const index = objectStore.index('byCreatedAt'); const [values, keys] = await Promise.all([ index.getAll(), index.getAllKeys() ]); return keys.map((key, idx) => ({ key, value: values[idx] })); }
2. 按主键降序
如果是按主键降序,无需额外创建索引,只需在打开游标时指定方向为prev(默认next是升序):
async function getEntriesByPrimaryKeyDesc(objectStore) { const entries = []; return new Promise((resolve, reject) => { // 打开游标,第二个参数传'prev'表示降序遍历 const cursorRequest = objectStore.openCursor(null, 'prev'); cursorRequest.onsuccess = (e) => { const cursor = e.target.result; if (cursor) { entries.push({ key: cursor.key, value: cursor.value }); cursor.continue(); } else { resolve(entries); } }; cursorRequest.onerror = (e) => reject(e.target.error); }); }
如果你的Promise封装工具类已经处理了游标逻辑,可以直接复用封装后的方法,只需要传入prev参数即可。
内容的提问来源于stack exchange,提问作者live627
相关产品推荐
相关产品推荐

