Метод iterate в библиотеке localForage предназначен для
последовательного обхода всех сохранённых записей в текущем
хранилище.
localforage.iterate(iteratorCallback)
или с использованием Promise:
localforage.iterate(iteratorCallback).then(finalValue => {
// результат завершения итерации
});
Метод всегда возвращает Promise, который резолвится
после завершения обхода всех элементов.
iterate предоставляет универсальный способ пройти по
всем ключ-значение парам независимо от используемого драйвера хранения
(IndexedDB, WebSQL или localStorage).
Ключевая особенность заключается в том, что метод абстрагирует различия между механизмами хранения и предоставляет единый интерфейс итерации.
Функция-итератор имеет следующую форму:
function iteratorCallback(value, key, iterationNumber) {
// логика обработки
}
Параметры:
Возвращаемое значение callback не влияет на процесс обхода.
Итерация выполняется асинхронно. Даже если хранилище небольшое, выполнение не блокирует основной поток.
Порядок обхода записей не гарантируется. Он зависит от:
Следовательно, логика не должна опираться на последовательность ключей.
Метод возвращает Promise, который резолвится после
завершения обхода:
localforage.iterate((value, key, index) => {
console.log(key, value, index);
}).then(() => {
console.log('итерация завершена');
});
Значение, передаваемое в then, обычно не используется,
так как результат формируется в процессе callback-обработки.
localforage.iterate((value, key, index) => {
console.log(`№${index}: ${key} =`, value);
});
let count = 0;
localforage.iterate((value) => {
if (value && value.active) {
count++;
}
}).then(() => {
console.log('Активных записей:', count);
});
let foundKey = null;
localforage.iterate((value, key) => {
if (value.type === 'target') {
foundKey = key;
}
}).then(() => {
console.log('Найденный ключ:', foundKey);
});
Метод не предоставляет встроенной возможности остановить итерацию досрочно. Даже если внутри callback выполняется условие нахождения нужного значения, обход продолжается до конца.
localforage.iterate((value) => {
if (value === 'stop-condition') {
// нельзя прервать итерацию стандартным способом
}
});
Это связано с тем, что API построен на асинхронных курсорах и унифицирован для разных драйверов.
Метод работает в контексте текущего экземпляра localForage:
const store = localforage.createInstance({
name: 'app'
});
store.iterate((value, key) => {
console.log(key, value);
});
Каждый экземпляр имеет собственное пространство ключей и независимую итерацию.
Метод часто применяется для вычисления агрегатов:
let sum = 0;
localforage.iterate((value) => {
if (typeof value === 'number') {
sum += value;
}
}).then(() => {
console.log('Сумма:', sum);
});
const items = [];
localforage.iterate((value, key) => {
items.push({ key, value });
}).then(() => {
console.log(items);
});
При больших объёмах данных производительность зависит от:
IndexedDB показывает наилучшие результаты, так как использует ленивую загрузку через курсоры. localStorage значительно уступает из-за синхронной природы и строкового хранения.
Callback вызывается для каждой записи, поэтому:
setItem/removeItem без строгой логикиИзменение данных во время итерации может приводить к непредсказуемым результатам, особенно в IndexedDB.