Библиотека Idb-keyval предоставляет удобный
интерфейс для работы с IndexedDB в браузере, позволяя хранить
ключ-значение без необходимости писать сложные запросы. Одной из
ключевых функций является update, которая позволяет
модифицировать существующие значения в хранилище, сохраняя при этом
атомарность операции.
Функция update не просто перезаписывает значение по
ключу. Она принимает ключ и функцию-коллбек, которая
получает текущее значение и возвращает новое. Это делает обновление
безопасным, особенно когда несколько операций могут происходить
одновременно, предотвращая потерю данных.
import { upd ate } from 'idb-keyval';
update('counter', value => (value || 0) + 1);
В этом примере значение ключа 'counter' увеличивается на
единицу. Если ключа ещё нет, используется значение по умолчанию
0. Таким образом, update объединяет проверку
существования, чтение и запись в одну операцию.
Сигнатура функции выглядит так:
update<Key, Value>(key: Key, updater: (value: Value | undefined) => Value | undefined): Promise<Value | undefined>
key — ключ, по которому хранится
значение в IndexedDB. Может быть строкой, числом или объектом,
поддерживаемым IndexedDB.updater — функция, принимающая текущее
значение (или undefined, если ключ отсутствует) и
возвращающая новое значение. Если функция возвращает
undefined, ключ будет удалён из хранилища.undefined, если ключ
удалён.Ключевое преимущество update в том, что она позволяет
работать с состоянием как с атомарным объектом: нет риска, что два
одновременных обновления перезапишут друг друга.
update('visits', visits => (visits || 0) + 1);
Каждый раз при посещении страницы счётчик увеличивается. Здесь
функция update исключает необходимость проверять
существование ключа вручную.
update('userSettings', settings => ({
...settings,
theme: 'dark'
}));
Если ключ 'userSettings' отсутствует,
settings будет undefined, и оператор
распространения создаст новый объект с нужным полем.
undefinedupdate('sessionToken', () => undefined);
Возвращаемое undefined приводит к удалению ключа из
IndexedDB, что позволяет легко реализовать логику очистки или сброса
состояния.
Функция update поддерживает синхронные
коллбеки. Если обновление требует асинхронной логики, её
следует обрабатывать внутри промисов, но сам update не
поддерживает асинхронные функции напрямую. Например:
async function incrementAsyncCounter() {
const current = await get('asyncCounter');
await se t('asyncCounter', (current || 0) + 1);
}
Это обходной путь, когда нужно интегрировать асинхронные операции, такие как запросы к API, перед обновлением хранилища.
updateundefined автоматически удаляет ключ.update для любых сценариев, где требуется
модификация существующих данных, особенно когда ключ может быть не
создан.get и
set, чтобы сохранить предсказуемость.undefined внутри функции
обновления, чтобы избежать ошибок при работе с отсутствующими
значениями.Функция update является мощным инструментом для работы с
клиентскими хранилищами, обеспечивая лаконичный синтаксис и атомарность,
что делает её незаменимой для приложений с динамическим состоянием.