Метод getItem в библиотеке localForage
является базовым механизмом чтения данных из асинхронного клиентского
хранилища. Он абстрагирует различия между IndexedDB,
WebSQL и localStorage, предоставляя единый API
для получения ранее сохранённых значений по ключу.
В JavaScript-реализации localForage метод имеет следующую форму:
localforage.getItem(key)
Где:
Возвращаемое значение — Promise, который разрешается
в сохранённое значение или null, если ключ отсутствует.
Для понимания внутренних типов и поведения удобнее рассматривать строго типизированную форму:
getItem<T = any>(key: string): Promise<T | null>
Расширенная версия с учетом callback-совместимости:
getItem<T = any>(
key: string,
callback?: (err: any, value: T | null) => void
): Promise<T | null>
Тип: string
Ключ, по которому происходит чтение данных.
Особенности:
setItemuser.name не
интерпретируется как путь)Метод всегда возвращает:
Promise<T | null>
localForage автоматически сериализует и десериализует данные.
При записи:
localforage.setItem("user", { name: "Alex" })
данные сохраняются в сериализованном виде (JSON или внутренний формат IndexedDB).
При чтении:
const user = await localforage.getItem("user");
возвращается уже восстановленный объект:
{ name: "Alex" }
Важно:
undefined значения внутри структуры могут быть
потеряныDate, Blob, ArrayBuffer
поддерживаются частично через встроенные механизмы драйверовЕсли ключ отсутствует:
const value = await localforage.getItem("missing");
console.log(value); // null
Это важное отличие от localStorage, где возвращается
строка "null" или undefined через каст.
getItem всегда асинхронен вне зависимости от
используемого драйвера.
IndexedDB — асинхронный APIДаже если выбран localStorage как fallback-драйвер,
операция всё равно оборачивается в Promise.
localforage.getItem("token").then(token => {
console.log(token);
});
async function loadSession() {
const session = await localforage.getItem("session");
return session;
}
const data = await localforage.getItem("cache");
if (data === null) {
console.log("Данные отсутствуют");
}
const settings = await localforage.getItem("settings");
if (settings) {
console.log(settings.theme);
console.log(settings.language);
}
localForage сохраняет обратную совместимость с callback API:
localforage.getItem("key", (err, value) => {
if (err) {
console.error(err);
return;
}
console.log(value);
});
Особенности:
Использование дженериков позволяет явно задавать ожидаемый тип:
interface User {
id: number;
name: string;
}
const user = await localforage.getItem<User>("user");
Это улучшает:
Метод может отклонить Promise в случаях:
Пример обработки:
try {
const value = await localforage.getItem("data");
} catch (err) {
console.error("Ошибка чтения:", err);
}
При вызове getItem происходит цепочка операций:
Определение активного драйвера
Поиск ключа в соответствующем backend:
Чтение сериализованного значения
Десериализация через внутренний serializer
Возврат результата через Promise
Важно различать:
null как отсутствие значенияundefined как невалидное состояние (не сохраняется
напрямую)Пример:
await localforage.setItem("a", null);
const value = await localforage.getItem("a");
console.log(value); // null
getItem безопасен при конкурентных вызовах:
localforage.getItem("key1");
localforage.getItem("key1");
localforage.getItem("key1");
Все запросы читают одно и то же состояние без блокировок на уровне API.
Однако поведение может зависеть от драйвера IndexedDB, где операции выполняются в очереди транзакций.
Факторы влияния:
Оптимизация достигается за счёт:
const data = localforage.getItem("key");
Результат:
data будет Promise, а не значениеconst value = await localforage.getItem("key");
// ожидание string, но получен object
Решается типизацией или явной обработкой структуры.
let value;
localforage.getItem("key").then(v => value = v);
console.log(value); // undefined
Метод поддерживается во всех современных браузерах:
Также работает в:
В приватном режиме:
При полной блокировке storage API метод возвращает ошибку через reject.
getItem тесно связан с:
setItem — запись данныхremoveItem — удаление ключаclear — очистка хранилищаkeys — перечисление ключейТипичный поток:
await localforage.setItem("a", 1);
const a = await localforage.getItem("a");
await localforage.removeItem("a");
Фактически метод объединяет три слоя:
Именно это делает его поведение универсальным и независимым от платформы.