Промисы как основа всех операций

Idb-keyval — это легковесная обёртка над IndexedDB в браузере, которая упрощает работу с асинхронным хранилищем ключ-значение. Все операции в библиотеке построены на промисах, что обеспечивает единообразный и удобный способ обработки результатов и ошибок.

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

import { get, set, del, clear, keys } from 'idb-keyval';

Каждая функция возвращает промис, что позволяет использовать .then() и async/await для обработки результатов.


Работа с ключами и значениями

Установка значения

Функция set принимает два аргумента: ключ и значение. Она возвращает промис, который выполняется после успешного сохранения.

await set('username', 'ivan');

Ключом может быть строка, числовое значение или объект, а значением — любые сериализуемые данные, включая объекты и массивы.

Получение значения

get принимает ключ и возвращает промис с результатом. Если ключ не найден, промис выполнится со значением undefined.

const username = await get('username');
console.log(username); // 'ivan'

Особенность промисов здесь в том, что они позволяют легко обрабатывать отложенные данные без блокировки основного потока.

Удаление и очистка

Функция del удаляет конкретный ключ:

await del('username');

Функция clear полностью очищает хранилище:

await clear();

Обе функции возвращают промис, что обеспечивает возможность цепочки операций:

await set('a', 1).then(() => del('a')).then(() => console.log('Готово'));

Использование промисов для последовательных операций

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

await set('count', 10)
  .then(() => get('count'))
  .then(value => set('count', value + 1))
  .then(() => get('count'))
  .then(value => console.log(value)); // 11

С помощью async/await такой код становится ещё читаемее:

let count = await get('count');
count += 1;
await set('count', count);

Промисы гарантируют, что операции выполняются в правильном порядке, даже при асинхронной природе IndexedDB.


Создание собственного хранилища

Idb-keyval позволяет создавать экземпляры хранилища для разделения данных.

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

const myStore = new Store('my-db', 'my-store');
await set('theme', 'dark', myStore);
const theme = await get('theme', myStore);

Каждое собственное хранилище работает с тем же API на промисах, что обеспечивает одинаковую обработку результатов и ошибок.


Получение всех ключей

Функция keys возвращает промис с массивом всех ключей:

const allKeys = await keys();
console.log(allKeys); // ['username', 'count', 'theme']

Использование промисов позволяет легко комбинировать keys() с get() для итеративного получения всех значений:

for (const key of await keys()) {
  const value = await get(key);
  console.log(key, value);
}

Обработка ошибок

Промисы в idb-keyval поддерживают стандартный механизм .catch() и блок try/catch при async/await:

try {
  const data = await get('nonexistent-key');
  console.log(data);
} catch (err) {
  console.error('Ошибка доступа к IndexedDB:', err);
}

Все ошибки, возникающие при взаимодействии с IndexedDB, автоматически передаются в промис, что упрощает централизованную обработку ошибок.


Асинхронные цепочки с Promise.all

Для параллельного выполнения нескольких операций можно использовать Promise.all:

await Promise.all([
  set('a', 1),
  set('b', 2),
  set('c', 3)
]);

const [a, b, c] = await Promise.all([get('a'), get('b'), get('c')]);
console.log(a, b, c); // 1 2 3

Такой подход минимизирует время ожидания и полностью использует асинхронные возможности IndexedDB.


Резюме ключевых особенностей промисов в Idb-keyval

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

Понимание промисов в контексте idb-keyval позволяет использовать IndexedDB без сложного колбэк-кода, обеспечивая чистоту, предсказуемость и управляемость асинхронных операций.