Полная сигнатура removeItem

Метод removeItem в библиотеке localForage предназначен для асинхронного удаления значения по ключу из выбранного хранилища. Он абстрагирует различия между IndexedDB, WebSQL и localStorage, предоставляя единый Promise-ориентированный интерфейс.


Полная сигнатура метода

removeItem(key): Promise<void>

В контексте экземпляра:

localforage.removeItem(key)

или при использовании изолированного хранилища:

const store = localforage.createInstance({
  name: 'appDB',
  storeName: 'cache'
});

store.removeItem(key)

Параметры

key

Тип: String

Ключ, по которому хранится значение в локальном хранилище. Может быть любым строковым идентификатором, допустимым для выбранного драйвера.

Особенности ключа:

  • В IndexedDB используется как primary key в object store
  • В localStorage хранится как строковый ключ словаря
  • В WebSQL используется как значение колонки key в таблице

Возвращаемое значение

Метод возвращает:

Promise<void>

Promise всегда приводит к состоянию:

  • fulfilled — операция удаления завершена (даже если ключ отсутствовал)
  • rejected — произошла ошибка доступа к хранилищу или драйверу

Важно: отсутствие ключа не считается ошибкой и не вызывает reject.


Поведение в различных драйверах

IndexedDB

При использовании IndexedDB:

  • Выполняется операция objectStore.delete(key)
  • Удаление происходит транзакционно
  • Если ключ отсутствует, транзакция завершается успешно
  • Производительность зависит от индексации и размера базы

Особенность: IndexedDB гарантирует атомарность операции удаления в пределах транзакции.


WebSQL (устаревший драйвер)

В WebSQL:

  • Выполняется SQL-запрос вида:

    DELETE FR OM store WH ERE key = ?
  • Удаление синхронизируется через транзакции SQLite-подобного уровня

  • Поведение идентично IndexedDB: отсутствие записи не вызывает ошибки


localStorage

В localStorage:

  • Выполняется localStorage.removeItem(key)
  • Операция синхронная внутри драйвера, но обёрнута в Promise
  • Пространство ключей ограничено строками

Memory driver

При использовании memory driver:

  • Удаление происходит из JavaScript-объекта

  • Эквивалент:

    delete store[key]
  • Данные исчезают после перезагрузки страницы


Пример базового использования

import localforage from "localforage";

localforage.setItem("sessionToken", "abc123")
  .then(() => localforage.removeItem("sessionToken"))
  .then(() => console.log("Удалено"))
  .catch(err => console.error("Ошибка:", err));

Асинхронная природа операции

removeItem всегда асинхронен, даже если текущий драйвер использует синхронное хранилище.

Это означает:

  • нельзя полагаться на немедленное удаление после вызова
  • последовательность операций должна строиться через then или await

Пример с async/await:

async function clearCache() {
  await localforage.removeItem("cacheData");
}

Особенности поведения при повторном удалении

Если ключ уже удалён:

await localforage.removeItem("nonExistingKey");

результат:

  • Promise успешно завершается
  • исключения не генерируются
  • состояние хранилища не изменяется

Это делает метод идемпотентным, что важно для устойчивой логики очистки данных.


Влияние конфигурации хранилища

Метод removeItem работает в рамках текущей конфигурации экземпляра:

localforage.config({
  name: "MyApp",
  storeName: "users"
});

или:

const usersStore = localforage.createInstance({
  name: "MyApp",
  storeName: "users"
});

Удаление происходит только внутри указанного storeName, даже если ключ существует в другом хранилище.


Обработка ошибок

Promise может быть отклонён в следующих случаях:

1. Недоступность хранилища

  • IndexedDB отключён или заблокирован
  • localStorage недоступен (режим приватного просмотра в некоторых браузерах)

2. Квота или повреждение базы

  • повреждённая IndexedDB база
  • ошибки транзакций

3. Ошибки драйвера

  • некорректная инициализация localForage
  • конфликт версий схемы IndexedDB

Пример обработки:

localforage.removeItem("data")
  .catch(err => {
    console.error("Ошибка удаления:", err);
  });

Внутренний механизм (упрощённо)

Логика метода внутри localForage примерно соответствует:

function removeItem(key) {
  return new Promise((resolve, reject) => {
    driver.removeItem(key, (err) => {
      if (err) reject(err);
      else resolve();
    });
  });
}

На уровне IndexedDB это транслируется в:

transaction.objectStore(storeName).delete(key);

Параллельные операции удаления

При множественных вызовах:

Promise.all([
  localforage.removeItem("a"),
  localforage.removeItem("b"),
  localforage.removeItem("c")
]);

операции выполняются независимо и не блокируют друг друга, но фактическая параллельность зависит от драйвера:

  • IndexedDB: транзакции могут объединяться
  • localStorage: блокирующий доступ, но обёрнутый Promise
  • WebSQL: последовательные SQL транзакции

Удаление и целостность данных

removeItem влияет только на один ключ и не затрагивает:

  • другие записи в store
  • метаданные базы IndexedDB
  • конфигурацию localForage

Однако при использовании составных ключей логика приложения может требовать дополнительной очистки зависимых данных вручную.


Типичные сценарии использования

Очистка сессии

await localforage.removeItem("authToken");
await localforage.removeItem("refreshToken");

Удаление кэша записи

async function invalidateUser(userId) {
  await localforage.removeItem(`user:${userId}`);
}

Перезапись через удаление

Иногда используется как этап перед обновлением:

await localforage.removeItem("profile");
await localforage.setItem("profile", newProfileData);

Отличие от setItem(null)

Удаление через removeItem принципиально отличается от записи null:

  • removeItem удаляет ключ полностью
  • setItem(key, null) сохраняет ключ со значением null

Это различие критично при проверке существования:

await localforage.setItem("a", null);
await localforage.getItem("a"); // null, но ключ существует

await localforage.removeItem("a");
await localforage.getItem("a"); // null (как отсутствие значения)

Поведение при конкурентных изменениях

При одновременном выполнении:

  • setItem(key, value)
  • removeItem(key)

финальный результат зависит от порядка завершения транзакций драйвера, особенно в IndexedDB.

Типичный сценарий:

  • последний завершившийся вызов определяет итоговое состояние

Это требует осторожности при конкурентной записи и удалении одного ключа.


Оптимизационные аспекты

  • IndexedDB удаляет запись без полного пересканирования store
  • WebSQL использует индексированный DELETE
  • localStorage требует перезаписи всей структуры хранения ключей внутри браузера

Поэтому производительность removeItem зависит от драйвера и размера данных, но всегда линейна или близка к O(1) для IndexedDB.