Библиотека localForage построена поверх асинхронных API браузера, таких как IndexedDB, WebSQL и localStorage (в качестве fallback). Все операции чтения и записи выполняются асинхронно и возвращают Promise, что делает интеграцию с современным JavaScript удобной и предсказуемой.
Асинхронная природа означает отсутствие блокировки основного потока: операции с хранилищем не останавливают выполнение кода. Это особенно важно при работе с большими объёмами данных или частыми обращениями к storage.
Современный подход через async/await является надстройкой над Promise-API localForage и обеспечивает линейную структуру кода без цепочек then/catch.
Метод setItem выполняет запись значения по ключу и
возвращает Promise, который резолвится после успешного сохранения
данных.
import localforage from "localforage";
async function saveUser() {
const user = {
id: 1,
name: "Alex",
role: "admin"
};
const result = await localforage.setItem("user", user);
return result;
}
setItem сохраняет данные в выбранном драйвере (IndexedDB
приоритетно). Возвращаемое значение соответствует сохранённому объекту,
что позволяет сразу использовать результат без дополнительного
чтения.
Метод getItem выполняет асинхронное получение значения
по ключу. При отсутствии данных возвращается null.
async function loadUser() {
const user = await localforage.getItem("user");
if (!user) {
return null;
}
return user;
}
Операция чтения не блокирует поток выполнения и может использоваться в цепочках инициализации приложения. Тип возвращаемого значения зависит от того, что было сохранено ранее, так как localForage не навязывает сериализацию типов.
Метод removeItem удаляет запись по ключу и завершает
Promise после завершения операции удаления.
async function deleteUser() {
await localforage.removeItem("user");
}
Удаление является асинхронной операцией даже в случае использования простого хранилища, поскольку унифицируется модель работы с различными драйверами.
Метод clear удаляет все записи текущего хранилища.
async function resetStorage() {
await localforage.clear();
}
Операция затрагивает весь namespace текущего экземпляра localForage и завершает Promise после полного очищения данных.
Методы keys и length позволяют работать с
метаданными хранилища.
async function inspectStorage() {
const keys = await localforage.keys();
const size = await localforage.length();
return { keys, size };
}
keys возвращает массив всех ключей, а
length — количество записей. Оба метода асинхронны из-за
зависимости от IndexedDB, где даже простые операции выполняются через
запросы.
Метод iterate позволяет проходить по всем элементам
хранилища без предварительного получения списка ключей.
async function logAllItems() {
await localforage.iterate((value, key, iterationNumber) => {
console.log(iterationNumber, key, value);
});
}
Коллбек получает три параметра:
Итерация выполняется в порядке, определяемом драйвером, чаще всего соответствующим порядку вставки.
Все методы localForage возвращают Promise, который может быть отклонён при ошибках доступа к хранилищу, переполнении квоты или проблемах драйвера.
async function safeLoad() {
try {
const data = await localforage.getItem("config");
return data;
} catch (error) {
return null;
}
}
Конструкция try/catch полностью заменяет цепочки
.catch() при использовании async/await, сохраняя линейную
структуру кода.
Асинхронные методы localForage допускают последовательное выполнение, когда результат одной операции используется в следующей.
async function updateFlow() {
const user = await localforage.getItem("user");
const updated = {
...user,
lastActive: Date.now()
};
await localforage.setItem("user", updated);
}
Такая структура сохраняет читаемость и исключает необходимость вложенных then-цепочек.
Несколько независимых операций могут выполняться параллельно для уменьшения общего времени ожидания.
async function loadInitialData() {
const [user, settings, cache] = await Promise.all([
localforage.getItem("user"),
localforage.getItem("settings"),
localforage.getItem("cache")
]);
return { user, settings, cache };
}
Параллельное выполнение особенно эффективно при работе с IndexedDB, где каждый запрос выполняется как отдельная транзакция.
Асинхронные операции localForage часто используются на этапе загрузки состояния приложения.
async function initState() {
const [token, profile] = await Promise.all([
localforage.getItem("token"),
localforage.getItem("profile")
]);
return {
authenticated: Boolean(token),
profile
};
}
Такой подход позволяет синхронизировать состояние приложения с данными, сохранёнными в браузерном хранилище, без блокировки интерфейса.
localForage не выполняет строгую валидацию типов, поэтому обработка
null и undefined является частью логики
взаимодействия.
async function ensureConfig() {
let config = await localforage.getItem("config");
if (!config) {
config = { theme: "light", lang: "en" };
await localforage.setItem("config", config);
}
return config;
}
Асинхронная модель позволяет объединять проверку и инициализацию данных в одном потоке выполнения без дополнительных запросов к API.