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.
async/await обеспечивает чистый и
читаемый код.Promise.all для параллельных
операций повышает эффективность.Понимание промисов в контексте idb-keyval позволяет
использовать IndexedDB без сложного колбэк-кода, обеспечивая
чистоту, предсказуемость и управляемость асинхронных
операций.