Idb-keyval — это минималистичная обёртка над IndexedDB, предоставляющая простой API для работы с ключ–значение. Одной из ключевых особенностей IndexedDB является асинхронность операций, что напрямую влияет на порядок возврата данных. В отличие от синхронных коллекций, где порядок операций соответствует порядку выполнения, в Idb-keyval этот порядок может быть непредсказуемым.
Все методы Idb-keyval, такие как get, set,
del и clear, возвращают
Promise. Это означает, что фактическое завершение
операции зависит от движка IndexedDB и текущей нагрузки браузера:
import { set, get } from 'idb-keyval';
set('a', 1);
set('b', 2);
get('a').then(value => console.log('a:', value));
get('b').then(value => console.log('b:', value));
В этом примере вывод console.log не гарантирует порядок
a → b. Каждая операция выполняется независимо,
и завершение зависит от внутреннего планировщика IndexedDB. Даже если
set('a', 1) вызвана раньше set('b', 2),
браузер может обработать их в обратном порядке.
Idb-keyval не обеспечивает последовательную блокировку для нескольких операций. Это значит, что:
set или get могут
выполняться параллельно.Promise.all результат может содержать
данные в порядке вызова, но отдельные .then могут сработать
в произвольной последовательности.Promise.all([get('a'), get('b')]).then(values => {
console.log(values); // ['значение a', 'значение b'] – порядок сохранён
});
Здесь порядок элементов в массиве соответствует порядку в
Promise.all, но это не означает, что сами операции
завершились в том же порядке.
get и set. Для последовательного выполнения
требуется явное связывание через await или цепочку
.then.await set('x', 10);
const value = await get('x'); // Гарантированно 10
keys() или
entries() возвращает данные в порядке,
определённом IndexedDB. Этот порядок может не совпадать с порядком
записи:import { entries } from 'idb-keyval';
for await (const [key, value] of entries()) {
console.log(key, value);
}
Здесь перебор будет по порядку ключей в базе, а не по порядку вызова
set.
set операции могут завершаться в
произвольном порядке, если к базе обращаются несколько вкладок или
сервис-воркеров.Чтобы контролировать порядок возврата данных:
async/await для
последовательных операций:await set('first', 1);
await set('second', 2);
const first = await get('first');
const second = await get('second');
.then:set('first', 1)
.then(() => set('second', 2))
.then(() => get('first'))
.then(value => console.log(value));
Promise.all, но помнить, что порядок
разрешения .then индивидуальных Promises не
гарантирован.Асинхронная обработка и возможность параллельных операций дают преимущество:
Однако это требует внимательного подхода к порядку обработки данных и учёта, что результаты не возвращаются в порядке вызова функций.
await.onversionchange.Idb-keyval сочетает простоту API с мощью IndexedDB, но непредсказуемость порядка возврата данных — фундаментальная особенность, которая требует правильного управления асинхронностью.