Операция values: получение всех значений

Библиотека idb-keyval предоставляет упрощённый интерфейс для работы с IndexedDB, позволяя сохранять, извлекать и удалять данные с минимальным количеством кода. Операция values является одной из ключевых функций для получения всех значений, хранящихся в хранилище, без необходимости извлекать каждый ключ по отдельности.


Основные особенности метода values

  • Возвращает итерируемый объект, содержащий все значения из выбранного хранилища.
  • Поддерживает асинхронное использование через async/await или промисы.
  • Позволяет обходить хранилище без явного знания ключей.
  • Работает как с дефолтным хранилищем, так и с пользовательскими экземплярами Store.

Пример синтаксиса для дефолтного хранилища:

import { values } from 'idb-keyval';

async function getAllValues() {
  const allValues = [];
  for await (const value of values()) {
    allValues.push(value);
  }
  return allValues;
}

getAllValues().then(console.log);

Итерация значений

Метод values возвращает асинхронный итератор, что позволяет эффективно обрабатывать большие объёмы данных. Асинхронный итератор гарантирует, что получение значений будет происходить по мере их загрузки из IndexedDB, не блокируя основной поток.

Пример использования с циклом for await:

import { values } from 'idb-keyval';

(async () => {
  for await (const value of values()) {
    console.log(value);
  }
})();

Использование асинхронного итератора предпочтительно для больших коллекций, поскольку не требует загрузки всех данных в память сразу.


Получение значений из пользовательского хранилища

Библиотека позволяет создавать собственные экземпляры хранилища с указанием имени базы и объекта хранилища:

import { Store, values } from 'idb-keyval';

const customStore = new Store('my-database', 'my-store');

(async () => {
  for await (const value of values(customStore)) {
    console.log(value);
  }
})();

Такой подход удобен для разделения данных по разным областям приложения, например, кэширование пользовательских настроек отдельно от основной информации.


Преимущества использования values

  1. Простота и лаконичность — нет необходимости вручную перебирать ключи.
  2. Асинхронность — интеграция с async/await делает код чистым и читаемым.
  3. Совместимость с любым хранилищем — можно использовать дефолтное или кастомное.
  4. Эффективность памяти — благодаря итератору данные загружаются по одному, а не целиком.

Советы по использованию

  • Для фильтрации или трансформации значений лучше использовать цикл for await с условными операторами.
  • Если необходимо получить массив всех значений сразу, можно использовать следующий приём:
import { values } from 'idb-keyval';

async function getArrayOfValues() {
  return await Promise.all(values());
}
  • Для обработки очень больших объёмов данных рекомендуется работать непосредственно с итератором, чтобы избежать нагрузки на память.
  • Операция values совместима со всеми методами библиотеки: set, get, del, clear, что позволяет строить полноценный CRUD-код на IndexedDB с минимальными усилиями.

Примеры практического применения

Сохранение и последующее извлечение настроек пользователя:

import { set, values } from 'idb-keyval';

await set('theme', 'dark');
await set('language', 'ru');

const userSettings = [];
for await (const value of values()) {
  userSettings.push(value);
}

console.log(userSettings); // ["dark", "ru"]

Кэширование данных API:

import { set, values } from 'idb-keyval';

async function cacheApiData(dataArray) {
  for (const [id, data] of Object.entries(dataArray)) {
    await set(id, data);
  }
}

async function readCachedData() {
  const cached = [];
  for await (const item of values()) {
    cached.push(item);
  }
  return cached;
}

Итоговые ключевые моменты

  • Метод values обеспечивает удобное получение всех значений из IndexedDB.
  • Асинхронный итератор позволяет эффективно обрабатывать большие наборы данных.
  • Работает как с дефолтным, так и с кастомным хранилищем.
  • Интегрируется с другими методами idb-keyval, обеспечивая полный контроль над хранилищем данных.

Использование values упрощает работу с IndexedDB, позволяя сосредоточиться на логике приложения, а не на низкоуровневых операциях с базой данных.