Метод iterate в localForage имеет следующую
сигнатуру:
iterate(iteratee, successCallback?)
Полная поведенческая модель метода строится вокруг последовательного перебора всех ключей хранилища с доступом к значениям, при этом API остаётся асинхронным и унифицированным для разных драйверов (IndexedDB, WebSQL, localStorage).
Основной параметр: iteratee
(value, key, iterationNumber) => any
value — значение, сохранённое в хранилищеkey — строковый ключ элементаiterationNumber — порядковый номер итерации, начиная с
1Внутри функции this также ссылается на текущее значение
value, что важно при использовании обычных функций вместо
стрелочных.
Второй параметр (необязательный): successCallback
(err, result) => void
err — ошибка, если она произошла во время обходаresult — итоговое значение, возвращаемое последней
итерациейМетод также возвращает Promise, что делает возможным
использование async/await.
iterate последовательно проходит по всем элементам
хранилища. В отличие от методов работы с ключами (keys,
length), он сразу предоставляет доступ к значениям без
дополнительных обращений к getItem.
Ключевая особенность заключается в том, что обход происходит в порядке, определяемом внутренним драйвером хранилища. Это означает, что:
Метод возвращает Promise, который резолвится в значение,
возвращённое последним вызовом iteratee.
Если в теле iteratee происходит возврат значения, оно не
влияет на поток обхода, но сохраняется как потенциальный результат всей
операции.
Пример поведения:
const result = await localforage.iterate((value, key, index) => {
return value;
});
result будет равен значению последнего элемента, а не
промежуточным результатам.
Каждый вызов iteratee выполняется синхронно относительно
самой итерации, но вся операция остаётся асинхронной.
Последовательность:
iteratee для каждого элементаВажно, что нельзя прервать цикл стандартным break —
возврат из функции не влияет на продолжение итерации.
При использовании классической функции:
localforage.iterate(function(value, key, index) {
console.log(this === value);
});
this указывает на текущее значение. Это поведение
сохраняется для обратной совместимости, но в современных кодовых базах
чаще используется явное обращение к value.
Стрелочные функции не имеют собственного this,
поэтому:
localforage.iterate((value) => {
console.log(this); // не связано с value
});
let sum = 0;
await localforage.iterate((value) => {
if (typeof value === 'number') {
sum += value;
}
});
console.log(sum);
let found;
await localforage.iterate((value, key) => {
if (value && value.active === true) {
found = { key, value };
}
});
Следует учитывать, что даже после нахождения элемента итерация продолжится до конца, так как механизм остановки отсутствует.
const map = {};
await localforage.iterate((value, key) => {
map[key] = value;
});
iterate выполняет последовательный обход, что
означает:
Оптимизация достигается за счёт минимизации логики внутри
iteratee и избегания тяжёлых вычислений на каждой
итерации.
Если во время итерации происходит ошибка чтения из хранилища, Promise
отклоняется, а successCallback не вызывается.
localforage.iterate((value) => {
if (!value) {
throw new Error('Invalid value');
}
});
Такое исключение прерывает выполнение всей операции.
В отличие от keys() и последующего
getItem():
iterate уменьшает количество обращений к хранилищуПо сравнению с ручным циклом через keys:
const keys = await localforage.keys();
for (const key of keys) {
const value = await localforage.getItem(key);
}
iterate объединяет эти операции в один механизм, снижая
накладные расходы и упрощая структуру кода.
IndexedDB
WebSQL (устаревший)
localStorage