IndexedDB nie jest magazynem klucza i wartości w taki sam sposób, jak magazyn lokalny. Pamięć lokalna przechowuje tylko ciągi znaków, więc aby umieścić obiekt w pamięci lokalnej, typowym podejściem jest JSON.stringify it:
myObject = {a: 1, b: 2, c: 3};
localStorage.setItem("uniq", JSON.stringify(myObject));
Jest to dobre do znalezienia obiektu z kluczem uniq
, ale jedynym sposobem na odzyskanie właściwości myObject z pamięci lokalnej jest JSON.parse obiekt i zbadanie go:
var myStorageObject = JSON.parse(localStorage.getItem("uniq"));
window.alert(myStorageObject.b);
Jest to dobre, jeśli masz tylko jeden lub kilka obiektów w pamięci lokalnej. Ale wyobraź sobie, że masz tysiąc obiektów, z których wszystkie mają własność b
, i chcesz zrobić coś tylko z tymi, w których b==2
. Dzięki lokalnej pamięci będziesz musiał przejrzeć cały sklep i sprawdzićb
każdy przedmiot, co oznacza dużo zmarnowanego przetwarzania.
Dzięki IndexedDB możesz przechowywać inne elementy niż ciągi w wartości : „Obejmuje to proste typy, takie jak DOMString i Date, a także instancje Object i Array”. Nie tylko to, ale możesz tworzyć indeksy na właściwościach obiektów, które zostały zapisane w wartości. Więc dzięki IndexedDb możesz umieścić w nim te same tysiące obiektów, ale utworzyć indeks dla b
właściwości i użyć go do pobrania obiektów, w którychb==2
bez narzutu skanowania każdego obiektu w sklepie.
Przynajmniej taki jest zamysł. Interfejs API IndexedDB nie jest zbyt intuicyjny.
Wydaje się, że działają w tym samym wątku, w którym wykonano wywołania asynchroniczne. Jak to nie zablokuje interfejsu użytkownika?
Asynchroniczny to nie to samo, co wielowątkowy, JavaScript z reguły nie jest wielowątkowy . Każde ciężkie przetwarzanie, które wykonujesz w JS, zablokuje UI, jeśli chcesz zminimalizować blokowanie UI, wypróbuj Web Workers .
indexedDB pozwala na większy magazyn. Dlaczego nie zwiększyć rozmiaru sklepu HTML5?
Ponieważ bez odpowiedniego indeksowania stawałby się coraz wolniejszy, im większy byłby.