Метод length() в localForage возвращает количество
сохранённых записей в текущем хранилище. Это асинхронная операция,
основанная на Promise, и она предоставляет актуальное число ключей,
доступных в выбранном драйвере (IndexedDB, WebSQL или localStorage как
fallback).
Метод length() предназначен для получения размера
хранилища в виде количества ключ-значение пар. В отличие от синхронных
API браузерного localStorage, библиотека localForage всегда
работает асинхронно, что позволяет не блокировать основной поток
выполнения JavaScript.
Фактически length() отражает текущее состояние
выбранного storage backend-а и учитывает все записи, сохранённые через
localForage.
localforage.length().then(function(numberOfKeys) {
console.log(numberOfKeys);
});
Метод возвращает Promise<number>, где:
number — целое число, обозначающее количество элементов
в хранилищеАсинхронная природа length() обусловлена архитектурой
IndexedDB, на котором чаще всего базируется localForage. Даже если
драйвером выбран localStorage, библиотека сохраняет единый интерфейс и
возвращает Promise.
Это означает:
.then() или
async/awaitПример с async/await:
async function getStorageSize() {
const size = await localforage.length();
console.log(size);
}
При использовании IndexedDB метод length() выполняет
запрос к объектному хранилищу и получает количество записей через
встроенные механизмы индексации.
Особенности:
Если используется WebSQL (в старых браузерах), количество записей
определяется через SQL-запрос вида COUNT(*).
Особенности:
При использовании localStorage библиотека имитирует поведение асинхронного API.
Особенности:
Частая ошибка — попытка получить количество записей через:
localforage.keys().then(keys => keys.length);
Хотя результат будет аналогичным, есть принципиальная разница:
length() — оптимизированный метод, возвращающий число
напрямуюkeys() — возвращает массив всех ключей, что требует
больше памятиТаким образом:
length() предпочтителен для производительностиkeys() используется, когда необходимы сами ключиМетод оптимизирован под конкретный драйвер:
При больших объёмах данных использование length()
критично, так как он избегает полной загрузки всех ключей в память.
Метод часто применяется для:
Пример проверки пустого хранилища:
localforage.length().then(count => {
if (count === 0) {
console.log("Хранилище пустое");
} else {
console.log("Есть сохранённые данные");
}
});
Если в процессе работы приложения меняется драйвер:
localforage.setDriver([
localforage.INDEXEDDB,
localforage.WEBSQL,
localforage.LOCALSTORAGE
]);
то length() всегда возвращает значение из текущего
активного драйвера. Это важно учитывать, поскольку разные драйверы могут
содержать разные наборы данных.
Метод может возвращать отклонённый Promise в случаях:
Пример обработки ошибок:
localforage.length()
.then(count => {
console.log(count);
})
.catch(err => {
console.error("Ошибка получения длины:", err);
});
Внутри localForage метод length() делегируется
драйверу:
Определяется текущий storage backend
Вызывается соответствующий метод драйвера:
Результат нормализуется
Возвращается Promise с числом
Несмотря на простоту, метод имеет ряд особенностей:
В отличие от:
localStorage.length (синхронный, глобальный)IndexedDB.count() (низкоуровневый API)метод length() в localForage:
В SPA и PWA метод часто используется как часть:
Пример логики первичной загрузки:
async function initApp() {
const hasData = await localforage.length();
if (hasData === 0) {
await fetchAndCacheData();
} else {
await loadFromCache();
}
}
Если используются разные инстансы localForage с разными
конфигурациями storeName, то length() будет
возвращать значение только для текущего пространства имён.
Это важно при архитектуре:
При параллельных операциях записи и удаления:
length() может изменяться между вызовамиПоэтому метод следует использовать как индикативный, а не как строго синхронизированное состояние.
length() вместо keys().length
для больших хранилищiterate() при необходимости анализа
данныхМетод часто применяется совместно с:
setItem() — добавление данныхremoveItem() — удаление данныхclear() — очистка хранилищаkeys() — получение списка ключейПример контроля после очистки:
await localforage.clear();
const size = await localforage.length(); // всегда 0