IndexedDB 中用游标遍历大数据需调用 openCursor() 按需读取,通过 continue() 或 advance(n) 推进,配合 range 限定范围、方向控制、异步链式处理及中断防护,避免内存溢出。

IndexedDB 中用游标(Cursor)遍历大数据,核心是避免一次性加载全部数据到内存,而是按需读取、逐条或分批处理。关键在于正确打开游标、控制遍历方向、及时终止和处理异步流程。
用 openCursor() 启动遍历
不能直接用 getAll() 拿大量数据,否则容易卡顿甚至崩溃。应调用对象存储的 openCursor() 方法启动游标遍历:
- 支持传入
range(KeyRange)限定键范围,比如只查 ID 在 100–1000 之间的记录 - 第二个参数可指定方向:
"next"(正向)、"prev"(反向)、"nextunique"(跳过重复主键)等 - 返回的是 Promise 包裹的
IDBRequest,成功后在onsuccess中拿到event.target.result—— 这就是当前游标对象(IDBCursor)
在 cursor.continue() 中递归推进
游标默认只停在第一条匹配记录上,要继续往下走,必须显式调用 cursor.continue():
- 每次调用后触发下一次
onsuccess,直到游标移出范围(result变为null) - 可在每次命中时处理数据,比如累计、过滤、写入另一个 store,或节流后更新 UI
- 避免在循环中无条件连续调用 —— 要等上一次 continue 完成后再调下一次(利用 Promise 链或 async/await)
用 cursor.advance(n) 跳过前 n 条(适合分页)
如果要做“加载更多”或服务端分页模拟,不用手动 continue n 次,直接用 cursor.advance(n):
立即学习“Java免费学习笔记(深入)”;
- 让游标向前跳过 n 条记录,再停在第 n+1 条上
- 常配合
openCursor(range, "next")使用:先定位起始范围,再 advance 跳到偏移位置 - 注意:advance 不会触发 onsuccess,它只是移动位置;真正触发是在后续的 continue 或新开游标时
及时终止与错误防护
大数据遍历耗时长,用户可能切页、刷新或取消操作,必须支持中断:
- 保存当前 cursor 的
key或primaryKey,下次从该位置 resume(用 KeyRange.lowerBound) - 监听用户行为(如 visibilitychange),调用
transaction.abort()终止整个事务,游标自动失效 - 加 try/catch +
request.onerror,防止某条数据解析失败导致中断;可跳过异常项,继续continue()
游标遍历不是语法糖,它是 IndexedDB 处理海量本地数据的底层机制。写法稍繁琐,但换来的是稳定性和可控性。实际项目中建议封装成支持暂停/恢复/限速的迭代器函数。


















