Вопрос по indexeddb, database – Indexeddb: различия между onsuccess и oncomplete?

5

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

Давайте скажем ... объект db: IDBDatabase, объект tr: IDBTransaction, объект os: IDBObjectStore

tr = db.transaction(os_name,'readwrite');
os = tr.objectStore();

Случай 1 :

r = os.openCursor();
r.onsuccess = function(){
    if(r.result){
        callback_for_result_fetched();
        r.result.continue;
    }else callback_for_transaction_finish();
}

случай 2:

tr.oncomplete = callback_for_transaction_finish();

Это бесполезно, если они оба работают одинаково. Так вы можете сказать мне, есть ли разница между ними?

Это большой вопрос buley

Ваш Ответ

3   ответа
8

Извините, что поднял довольно старую ветку, но это хорошая отправная точка ...

Я искал похожий вопрос, но в несколько ином случае использования, и на самом деле не нашел ни хороших, ни вводящих в заблуждение ответов.

Подумайте о случае использования, когда вам нужно сделатьseveral writes в objectStore даже на несколько. Вы определенноdon't want управлять каждой отдельной записью и ее собственными событиями успеха и ошибок. В этом смысл транзакции, и это (правильная) ее реализация для indexedDB:

var trx = dbInstance.transaction([storeIdA, storeIdB], 'readwrite'),
    storeA = trx.objectStore(storeIdA),
    storeB = trx.objectStore(storeIdB);

    trx.oncomplete = function(event) {
        // this code will run only when ALL of the following requests are succeed
        // and only AFTER ALL of them were processed
    };
    trx.onerror = function(error) {
        // this code will run if ANY of the following requests will fail
        // and only AFTER ALL of them were processed
    };

    storeA.put({ key:keyA, value:valueA });
    storeA.put({ key:keyB, value:valueB });
    storeB.put({ key:keyA, value:valueA });
    storeB.put({ key:keyB, value:valueB });

Ключ к этому пониманию можно найти в следующем заявлении W3Cспекуляция:

To determine if a transaction has completed successfully, listen to the transaction’s complete event rather than the success event of a particular request, because the transaction may still fail after the success event fires.

именно то, что я искал. я предполагаю, что objectStore.onsuccess и objectStore.oncomplete также могут быть использованы для нескольких .add. получить, .put, и т. д ... на заданном хранилище объектов.
8

Хотя это верно, эти обратные вызовы функционируют аналогично, они не одинаковы: разница междуonsuccess а такжеoncomplete это транзакцииcomplete но запросы на эти транзакцииsuccessful.

oncomplete определяется только вспецификация в связи с транзакцией. Транзакция не имеетonsuccess Перезвоните.

Вы имели в виду, что когда транзакция завершена, это не означает, что вся обработка прошла успешно, не так ли? jerinho
да, это означает, что транзакция вышла за рамки и была совершена
2

Я только предупреждаю, что нет гарантии, что получение успешного trx.oncomplete означает, что данные были записаны на диск / базу данных:

Мы видим проблему с trx.oncomplete, когда данные не записываются в БД на диске. У FireFox есть объяснение того, что они сделали, что вызывает эту проблему здесь:https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction/oncomplete

Кажется, что windows / edge также имеет ту же проблему. По сути, нет никакой гарантии, что ваше приложение будет иметь данные, записанные в базу данных, если / когда пользователь решит убить или выключить устройство. В некоторых случаях мы даже пытались подождать до 15 минут, прежде чем завершать работу, и не видели записанных данных. Для меня я всегда хочу убедиться, что запись данных завершена и зафиксирована.

Существуют ли другие решения для реальной постоянной базы данных или улучшения IndexedDB, помимо экспериментального добавления FF ...

Похожие вопросы