не удается установить обратный вызов при успешном завершении транзакции добавления indexeddb

У меня проблема с установкой функции обратного вызова до добавления транзакции indexeddb

os = ...the object store (IDBObjectStore) object assigned here
os.onsuccess = function(){alert('dont mess with Messi')}
os.add({name:'Lionel Messi',team:'FC Barcelona',position:'striker',number:10});

запись была успешно добавлена ​​в хранилище объектов, но функция при событии onsuccess не запускается. есть еще одно событие, называемое onerror. я должен использовать это вместо этого? я так не думаю

не спрашивайте меня "можете ли вы указать часть ошибки?" потому что нет никакой ошибки


person jerinho.com    schedule 21.06.2012    source источник


Ответы (2)


Вы неправильно выполняете свой запрос. Ошибки нет, потому что вы просто добавляете атрибут onsuccess к объекту, который никогда его не вызовет.

Вы не добавляете onsuccess обратные вызовы в хранилище объектов, вы открываете транзакцию в objectStore и добавляете слушателя к этой транзакции.

В качестве рабочего примера использования индексов и транзакций ознакомьтесь с этим jsfiddle, над которым я недавно работал с другим StackOverflower. * Более сложный пример см. В моей библиотеке IndexedDB.

* Обратите внимание, что эта скрипка написана для старой (до декабря 2011 г.) реализации Chrome IDB. В более новой (FF) реализации будет использоваться обратный вызов onupgradeneeded, но в остальном она будет более или менее такой же.

person buley    schedule 22.06.2012
comment
я не могу это сделать, так как моя репутация все еще ниже 15 - person jerinho.com; 25.06.2012

Похоже, что вы назначаете обработчик неправильному объекту, обработчики onsuccess, onerror, onabort запускаются транзакцией, а не самим хранилищем объектов, поэтому код будет выглядеть так:

transaction = database.transaction([storeName], IDBTransaction.READ_WRITE);
 ..
 ..
os = transaction.objectStore(storeName);
transaction.oncomplete = function(e) { //do your stuff here } ;
os.add({ id : 1, name : 'John Doe'});

Можете ли вы опубликовать код, как вы получаете хранилище объектов, я думаю, из транзакции (не знаю других способов сделать это). Пожалуйста, дайте мне знать, работает ли приведенный выше код. Обратите внимание, что при создании хранилища объектов у объекта, который вы вставляете, должно быть свойство, определенное как ключ objectStore.

person toske    schedule 21.06.2012
comment
os = db.transaction (os_name, 'readwrite'). objectStore (os_name); что-то здесь странное. почему бы нам не использовать транзакцию для добавления записи. но обратный вызов по-прежнему запускается объектом транзакции. в любом случае спасибо приятель - person jerinho.com; 22.06.2012