IndexedDB не є сховищем ключ-значення так само, як і Місцеве сховище. Локальне сховище просто зберігає рядки, тому для розміщення об’єкта в локальному сховищі звичайним підходом є JSON.stringify :
myObject = {a: 1, b: 2, c: 3};
localStorage.setItem("uniq", JSON.stringify(myObject));
Це чудово для пошуку об’єкта з ключем uniq
, але єдиний спосіб повернути властивості myObject назад із локального сховища - це JSON.parse об’єкт і дослідити його:
var myStorageObject = JSON.parse(localStorage.getItem("uniq"));
window.alert(myStorageObject.b);
Це чудово, якщо у вас у локальному сховищі лише один або кілька об’єктів. Але уявіть, що у вас є тисяча об’єктів, котрі мають властивість b
, і ви хочете зробити щось саме з тими, де є b==2
. За допомогою локального сховища вам доведеться перебирати весь магазин і перевіряти b
кожен предмет, що є багато марної обробки.
За допомогою IndexedDB ви можете зберігати речі, крім рядків, у значенні : "Сюди входять прості типи, такі як DOMString і Date, а також екземпляри Object і Array." Мало того, але ви можете створювати індекси властивостей об’єктів, які ви зберігали у значенні. Тож за допомогою IndexedDb ви можете помістити в нього ті самі тисячі об’єктів, але створити індекс b
властивості та використовувати його для простого отримання об’єктів, де b==2
без накладних витрат на сканування кожного об’єкту в магазині.
Принаймні така ідея. API IndexedDB не дуже інтуїтивно зрозумілий.
Здається, вони працюють у тому самому потоці, що й асинхронні дзвінки. Як це не заблокує інтерфейс?
Асинхронний - це не те саме, що багатопотоковий, JavaScript, як правило, не багатопотоковий . Будь-яка важка обробка, яку ви робите в JS, заблокує інтерфейс, якщо ви хочете звести до мінімуму блокування інтерфейсу, спробуйте Web Workers .
indexedDB дозволяє збільшити сховище. Чому б не збільшити розмір магазину HTML5?
Оскільки, без належного індексування, воно ставало б все повільніше, чим більше воно ставало.