DBOpenRequest събития не се задействат

Боря се с отварянето на индексирана база данни. Ето моят код:

var db;

window.onload = function() {

    window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
    var DBOpenRequest = window.indexedDB.open("test", 1);

    DBOpenRequest.onerror = function(event) {
        console.log("DBOpenRequest.onerror");
    };

    DBOpenRequest.onsuccess = function(event) {
        console.log("DBOpenRequest.onsuccess");
        db = DBOpenRequest.result;
    };

    DBOpenRequest.onupgradeneeded = function(event) {
        console.log("DBOpenRequest.onupgradeneeded");
    };
};

но нито едно от събитията не се запалва. Всички свойства на DBOpenRequest са зададени на null, с изключение на readyState, зададено на „done“ и резултатът е зададен на IDBDatabase обект.

Какво липсва тук, за да имам достъп до indexdb чрез db променлива?


person Giedrius.S    schedule 27.01.2015    source източник


Отговори (2)


  1. Не е необходимо да чакате браузърът да задейства събитието за зареждане. готовността на indexedDB не е свързана с готовността на DOM. Можете просто да извикате indexedDB.open в глобалния обхват и той в крайна сметка ще се изпълни.

  2. Вероятно не се нуждаете от оператора, където проверявате за префиксите на доставчика. Префиксите като цяло са премахнати. Просто използвайте window.indexedDB и изтрийте този израз.

  3. Трябва също да слушате за блокираното събитие. Това събитие обикновено се задейства при отваряне на една и съща страница в няколко раздела по едно и също време. Когато са блокирани, другите събития няма да се задействат.

  4. Изглежда, че редът db = DBOpenRequest.result присвоява стойност (екземпляр на IDBDatabase обект), която е валидна само в рамките на обхвата на функцията, на променлива, дефинирана във външен обхват, където вече не е валидна. Това сигнализира за липса на опит с писането и използването на асинхронен код. Вероятно трябва да научите повече за асинхронния код, преди да продължите.

person Josh    schedule 27.01.2015
comment
Сигурни ли сте за точка 4? Копирането на екземпляра на db от манипулатора onsuccess е нещо, което съм правил преди с IDB без проблем. Използвах стойността на събитието, но не DBOpenRequest, но не трябва ли да работи добре? - person Raymond Camden; 28.01.2015
comment
Сигурен съм за 4. Понякога ще работи добре, но не винаги и е кодова миризма. По принцип вие експлоатирате и поемате риск, когато го правите. Това е приемлив риск, но само ако знаете какво правите и можете да отстраните грешките, които евентуално ще причини. Предполагам, че някой, който задава такъв тип въпроси, не го прави и не може. - person Josh; 28.01.2015
comment
Тогава нека ви попитам следното - как се справяте с извършването на ad hoq заявки по-късно? Поставяте ли всички тези обаждания в манипулатора onsuccess? Как работите с db в световен мащаб? - person Raymond Camden; 29.01.2015
comment
Освен това - имате ли доказателство (може би в спецификацията?), че db обектът, върнат при успех, не може да се използва отново? Както казах - никога не съм имал проблеми с него. И аз не съм сигурен как е кодовата миризма, но можем да се съгласим да не сме съгласни с това. - person Raymond Camden; 29.01.2015
comment
Вероятно извън обхвата на въпроса и отново ще бъде дълъг отговор. Накратко, отварям връзка, ако е необходимо, за да правя по-късни заявки. Всички обаждания са във всеки манипулатор за успешно свързване. Не използвам глобална db променлива. В спецификацията (w3.org/TR/IndexedDB), indexedDB.open е асинхронен. - person Josh; 29.01.2015
comment
Само защото .open е асинхронен, не означава, че не можем да поддържаме манипулатор на db по-късно. Не съм сигурен, че сте прав за това - но както казахте - излизаме извън обхвата. - person Raymond Camden; 29.01.2015
comment
Джош, за информация публикувах това в групата на IDB в Google. Има супер малък обем, но реших, че ще е по-добро място за обсъждане. - person Raymond Camden; 29.01.2015

Е, от една страна, при onsuccess, db идва от събитието, а не от оригиналния обект:

db = event.target.result;

Най-вероятно сте получили това като грешка във вашата конзола.

person Raymond Camden    schedule 27.01.2015
comment
event.target.result === DBOpenRequest.result - person Josh; 27.01.2015
comment
О, интересно - благодаря. Не знаех, че актуализира оригиналния обект на заявка - но това има смисъл. - person Raymond Camden; 28.01.2015