opencursor 是发起异步游标请求的操作,返回 idbrequest 对象;成功时 event.target.result 为 idbcursor 实例,含 key、primarykey、value 等属性及 continue()、advance() 等方法;游标依附事务,超时或结束即失效;支持 range 和 direction 参数控制遍历范围与方向。

在 HTML5 的 IndexedDB 中,openCursor 并不是“开启游标”的独立操作,而是 发起一个异步游标请求,用于遍历对象存储(Object Store)或索引(Index)中的记录。它的实现细节涉及请求生命周期、游标对象结构、遍历控制逻辑和错误处理机制。
游标请求的本质是异步 IDBRequest
openCursor() 方法返回一个 IDBRequest 对象,它本身不立即提供数据,而是触发底层数据库的异步读取流程:
- 调用后立即返回,不阻塞主线程;
- 当游标就绪(首个匹配项定位完成)时,请求触发
success事件,event.target.result是一个IDBCursor实例; - 若无匹配项(如空存储或范围不命中),
result为null,仍视为成功; - 发生权限、结构或事务状态异常时,触发
error事件。
IDBCursor 对象承载遍历能力与上下文信息
游标实例(event.target.result)包含关键属性和方法,构成遍历基础:
-
key:当前记录的主键(object store)或索引键(index); -
primaryKey:对应记录在 object store 中的实际主键(对 index 游标尤其重要); -
value:当前记录完整数据对象(仅当使用openCursor(),非openKeyCursor()); -
continue([key]):移动到下一条记录;可选传入 key 跳转至指定位置(需在游标范围内); -
advance(count):跳过count条记录,常用于分页加载; -
delete()和update(value):在当前位置执行写操作(需 readwrite 事务)。
遍历必须在 active transaction 生命周期内完成
游标依附于其创建时所属的事务(transaction 属性可见)。该事务一旦完成(commit 或 abort)或超时,游标自动失效:
- 后续调用
continue()会抛出InvalidStateError; - 不能跨事务复用游标;
- 长遍历应避免阻塞 UI,推荐结合
setTimeout或requestIdleCallback分片处理,防止事务超时(默认约 60 秒,但受浏览器策略影响)。
范围与方向控制由参数决定
openCursor() 支持两个可选参数,精细控制遍历行为:
-
range:可为
IDBKeyRange实例(如IDBKeyRange.bound(10, 20))或有效键值(自动转为only()),限定扫描范围; -
direction:字符串
"next"(默认)、"nextunique"、"prev"、"prevunique",分别控制升序/降序及是否跳过重复键(对 index 有效)。
例如:store.openCursor(IDBKeyRange.lowerBound(100), "prev") 表示从大于等于 100 的最大键开始,逆序遍历所有记录。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










