HTML怎么做IndexedDB游标_HTML IndexedDB cursor游标遍历【收藏】

冬明酱_6843

冬明酱_6843

2026-04-20

268人浏览

原创

indexeddb 中 cursor 是指向当前记录的异步指针,非可迭代对象,故不能用 for...of 遍历;必须在 onsuccess 回调中通过 continue() 或 advance() 推进,并检查 cursor 是否为 null 来终止遍历。

html怎么做indexeddb游标_html indexeddb cursor游标遍历【收藏】

IndexedDB 中 cursor 是什么,为什么不能直接用 for 循环遍历

游标(cursor)不是数组或可迭代对象,而是 IndexedDB 异步查询返回的一个“指针”,指向当前匹配的记录。它本身不包含全部数据,只提供 value、key、primaryKey 和移动方法(如 continue()、advance(n))。直接写 for (let item of cursor) 会报错,因为 cursor 没有 [Symbol.iterator]。

常见错误现象:TypeError: cursor is not iterable 或 undefined is not a function(误调 cursor.forEach)。

  • cursor 只能在 onsuccess 回调或 await cursor.advance(1) 后继续使用,不可跨事件循环保存引用
  • 每次调用 cursor.continue() 都会触发一次新的 onsuccess,必须在该回调里再次检查 event.target.result 是否为 null(表示遍历结束)
  • 若在游标打开期间修改了对应 objectStore 的数据结构(如删字段),后续 cursor.value 可能缺失属性,但不会报错

用 openCursor() 遍历所有记录(最常用场景)

这是读取整个 objectStore 的标准方式,适用于分页加载、全量导出、批量更新等。

关键点:必须在 onsuccess 里判断 cursor 是否存在,再处理值 + 主动推进。

html-deploy
html-deploy

使用 htmlcode.fun 将 HTML 内容或文件部署到网页,适用于用户要求“部署到网页”“托管此 HTML”“生成此前端...的实时链接”等场景。

下载
const transaction = db.transaction('users', 'readonly');
const store = transaction.objectStore('users');
const request = store.openCursor();

request.onsuccess = function(event) {
  const cursor = event.target.result;
  if (!cursor) return; // 游标到底,结束

  console.log(cursor.value.name); // 访问当前记录
  cursor.continue(); // 推进到下一条
};
  • 不要在 onsuccess 外调用 cursor.continue(),否则报 InvalidStateError
  • 如果想限制遍历数量,改用 cursor.advance(10) 替代 continue(),它跳过接下来 9 条,只取第 10 条
  • 注意事务生命周期:若遍历耗时长,事务可能自动关闭(尤其在 Safari 中),建议加 transaction.oncomplete 做收尾

用 index.openCursor() 按索引范围遍历(带条件筛选)

当需要查 “status = 'active'” 或 “createdAt > 2023-01-01” 这类条件时,必须先建索引,再用 index.openCursor(),不能靠 JS 过滤全部数据。

示例:查 status 索引中所有 'active' 记录

const index = store.index('status');
const range = IDBKeyRange.only('active');
const request = index.openCursor(range);

request.onsuccess = function(event) {
  const cursor = event.target.result;
  if (!cursor) return;

  console.log(cursor.value); // 注意:这里 cursor.value 是完整 record,不是索引值
  cursor.continue();
};
  • IDBKeyRange.lowerBound() / upperBound() 支持开闭区间,例如 IDBKeyRange.lowerBound(100, true) 表示 > 100
  • 如果索引是多字段(如 store.createIndex('byStatusAndAge', ['status', 'age'])),range 必须按字段顺序传数组,如 IDBKeyRange.bound(['active', 18], ['active', 65])
  • 未命中任何记录时,cursor 仍为 null,不会触发 error,这点和 get() 不同

用 async/await 封装游标遍历(避免回调地狱)

原生 IndexedDB 是纯事件驱动,但可以用 Promise 包一层,让逻辑更线性。注意:不能 await 整个游标,只能 await 每次 continue() 的结果。

function iterateCursor(cursor) {
  return new Promise((resolve) => {
    cursor.onsuccess = () => {
      resolve(cursor.result);
    };
  });
}

// 使用示例(在 transaction 内)
let cursor = await store.openCursor();
while (cursor) {
  console.log(cursor.value);
  cursor = await iterateCursor(cursor.continue());
}
  • 每次 cursor.continue() 返回的是新请求(IDBRequest),不是新游标,所以要 await 它的 success 结果才能拿到下一个 cursor
  • 这个模式容易忽略事务超时,建议搭配 transaction.abort() 防止卡死,或改用 getAll()(仅适用于小数据量)
  • Chrome 120+ 支持 cursor.next()(返回 Promise),但目前 Safari 和 Firefox 尚未实现,生产环境慎用

游标真正的复杂点不在语法,而在它和事务、版本升级、并发写入的耦合——比如遍历时另一个 tab 正在删库,你的 cursor.continue() 可能突然失败且无明确错误码。这种边界情况,文档很少提,但线上真会出。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5435

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3132

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2790

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2819

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4699

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2761

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2569

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2308

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2308

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 219人学习