Как получить данные из хранилища объектов от номера индекса n до k. Например, если у нас есть 100 записей в магазине (ProductStore), мне нужно перейти от индекса 11 к 20 или с 50 до 60. Мне нужно использовать это при разбивке на страницы. В mysql мы можем использовать предложения LIMIT и OFFSET, есть ли какой-либо эквивалент OFFSET в Indexeddb.

1
Gyan 5 Окт 2020 в 16:23

1 ответ

Лучший ответ

Вы можете использовать cursor.advance, чтобы пропустить записи. Для курсоров нет ограничений, вы просто прекращаете итерацию, подсчитывая, сколько раз вы выполняли итерацию.

Что-то вроде этого:

function query(db, criteria, offset, limit) {
  return new Promise((resolve, reject) => {
    const results = [];
    const transaction = db.transaction('store');
    transaction.oncomplete = event => resolve(results);
    transaction.onerror = event => reject(event.target);
    const store = transaction.objectStore('store');
    const index = store.index('index');
    const request = index.openCursor(criteria);

    let advanced = offset === 0;
    let counter = 0;
    
    request.onsuccess = event => {
      const cursor = event.target.result;
      if (!cursor) {
        return;
      }

      if (!advanced) {
        advanced = true;
        cursor.advance(offset);
      }

      counter++;
      results.push(cursor.value);

      if (counter >= limit) {
        return;
      }
      cursor.continue();
    };
  });
}
1
Josh 5 Окт 2020 в 14:18