Операция get: чтение значения по ключу

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

import { get } from 'idb-keyval';

get('username').then(value => {
    console.log(value);
});

В этом примере ключ 'username' используется для получения данных из хранилища по умолчанию.


Синтаксис и параметры

Метод get имеет следующий базовый синтаксис:

get(key, store);

Параметры:

  • key — обязательный. Ключ для поиска значения. Может быть строкой, числом или любым другим сериализуемым объектом.
  • store — необязательный. Объект хранилища (IDBObjectStore), используемый при чтении данных. Если не указан, используется стандартное хранилище default.

Работа с асинхронными данными

Так как get возвращает промис, данные извлекаются асинхронно. Для работы с результатом можно использовать:

Метод .then()

get('settings').then(settings => {
    console.log(settings);
});

Асинхронная функция с await

async function loadSettings() {
    const settings = await get('settings');
    console.log(settings);
}
loadSettings();

Асинхронный подход позволяет писать код в линейном стиле, избегая вложенных коллбэков.


Особенности обработки отсутствующих ключей

Если ключ отсутствует в хранилище, промис возвращает undefined. Это важно учитывать при условной обработке данных:

get('theme').then(value => {
    if (value === undefined) {
        console.log('Ключ не найден, использовать настройки по умолчанию');
    } else {
        console.log('Тема:', value);
    }
});

Это позволяет безопасно применять значения по умолчанию без генерации ошибок.


Использование нестандартных хранилищ

idb-keyval позволяет создавать отдельные хранилища для разных наборов данных:

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

const userStore = new Store('user-database', 'user-store');

get('username', userStore).then(username => {
    console.log(username);
});

Создание собственного объекта Store полезно для разделения данных по категориям или функциональности приложения.


Типы данных, которые можно хранить и извлекать

idb-keyval поддерживает большинство сериализуемых структур:

  • Примитивы: строки, числа, булевы значения
  • Объекты и массивы
  • Map и Set
  • TypedArray и ArrayBuffer
const userProfile = { name: 'Alice', age: 30 };
await set('profile', userProfile);
const profile = await get('profile');
console.log(profile.name); // Alice

Все данные сохраняются в IndexedDB и автоматически сериализуются/десериализуются.


Обработка ошибок при чтении

Хотя idb-keyval упрощает работу с IndexedDB, ошибки всё же возможны. Метод get может быть отклонён при проблемах с доступом к базе или нарушением структуры:

get('someKey').catch(error => {
    console.error('Ошибка при чтении значения:', error);
});

Рекомендуется всегда предусматривать блок .catch() или конструкцию try/catch при использовании await.


Оптимизация чтения данных

Для повышения производительности:

  • Чтение небольших объектов быстрее, поэтому важно не перегружать хранилище огромными структурами.
  • Использовать отдельные хранилища для редко изменяемых и часто используемых данных.
  • Комбинировать get с другими методами (set, del) в транзакциях при необходимости атомарных операций.

Совместное использование с другими методами

Метод get хорошо сочетается с:

  • set(key, value) — для записи данных перед чтением
  • del(key) — для удаления ключей
  • upd ate(key, updater) — для обновления значения с использованием функции

Пример комбинации:

import { get, se t, upd ate } from 'idb-keyval';

async function incrementCounter() {
    const count = await get('counter') || 0;
    await se t('counter', count + 1);
}

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


Метод get является базовым инструментом для асинхронного доступа к хранилищу IndexedDB через idb-keyval. Его простота и поддержка промисов делают код чистым, а использование нестандартных хранилищ и сложных типов данных позволяет строить гибкую архитектуру хранения.