IDBCursor: continuePrimaryKey() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

注意:此功能在 Web Workers 中可用。

continuePrimaryKey() 方法属于 IDBCursor 接口,用于将光标移动到键匹配 key 参数且主键匹配 primaryKey 参数的对象。

一个典型的用例是,在之前关闭的光标处恢复迭代,而无需逐个比较键。

在加载新的光标数据之前多次调用此方法(例如,在同一个 onsuccess 处理程序中调用两次 continuePrimaryKey())将在第二次调用时抛出 InvalidStateError,因为光标的 got value 标志已被取消设置。

此方法仅对来自索引的光标有效。将其用于来自对象存储的光标会引发错误。

语法

js
continuePrimaryKey(key, primaryKey)

参数

key

用于定位光标的键。

primaryKey

用于定位光标的主键。

返回值

无(undefined)。

异常

此方法可能会抛出以下类型之一的DOMException

TransactionInactiveError DOMException

如果此 IDBCursor 的事务处于非活动状态,则抛出此异常。

DataError DOMException

如果 key 参数满足以下任一条件,则抛出此异常:

  • 键不是有效键。
  • 键小于或等于光标当前位置,并且光标的方向为 nextnextunique
  • 键大于或等于光标当前位置,并且光标的方向为 prevprevunique
InvalidStateError DOMException

如果光标当前正在迭代或已迭代到末尾,则抛出此异常。

InvalidAccessError DOMException

如果光标的方向不是 prevnext,则抛出此异常。

示例

以下是如何在上次访问后恢复标签为 "javascript" 的所有文章的迭代:

js
let request = articleStore.index("tag").openCursor();
let count = 0;
let unreadList = [];
request.onsuccess = (event) => {
  let cursor = event.target.result;
  if (!cursor) {
    return;
  }
  let lastPrimaryKey = getLastIteratedArticleId();
  if (lastPrimaryKey > cursor.primaryKey) {
    cursor.continuePrimaryKey("javascript", lastPrimaryKey);
    return;
  }
  // update lastIteratedArticleId
  setLastIteratedArticleId(cursor.primaryKey);
  // preload 5 articles into the unread list;
  unreadList.push(cursor.value);
  if (++count < 5) {
    cursor.continue();
  }
};

规范

规范
Indexed Database API 3.0
# ref-for-dom-idbcursor-continueprimarykey①

浏览器兼容性

另见