7

IndexedDB トランザクションが終了または成功したときにコールバックが応答するように、2 つの異なるイベントを使用します。

たとえば... 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();

両方とも同じように動作するのはもったいないです。では、教えていただけますか。両者の間に違いはありますか。

4

3 に答える 3

9

かなり古いスレッドを立ち上げて申し訳ありませんが、質問は良い出発点です...

私は同様の質問を探しましたが、少し異なるユースケースで、実際には良い答えや誤解を招くものさえ見つかりませんでした.

複数の objectStore に複数の書き込みを行う必要がある場合の使用例を考えてみてください。個々の書き込みを管理したくないことは間違いなく、それは独自の成功イベントとエラー イベントです。これがトランザクションの意味であり、これは 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仕様のステートメントにあります。

トランザクションが正常に完了したかどうかを判断するには、特定のリクエストの成功イベントではなく、トランザクションの完了イベントをリッスンします。これは、成功イベントの発生後にトランザクションが失敗する可能性があるためです。

于 2014-04-14T08:11:25.313 に答える
8

確かにこれらのコールバックは同じように機能しますが、同じではありませonsuccessん。oncompletecompletesuccessful

oncompleteトランザクションに関連するものとして仕様でのみ定義されています。トランザクションにはコールバックがありませんonsuccess

于 2012-06-22T02:37:07.750 に答える
2

trx.oncomplete が成功しても、データがディスク/データベースに書き込まれたことを意味するという保証はありません。

データがディスク上のデータベースに書き込まれていないという trx.oncomplete に関する問題が発生しています。FireFox には、この問題を引き起こしている原因についての説明があります: https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction/oncomplete

Windows/Edge にも同じ問題があるようです。基本的に、ユーザーがデバイスの強制終了または電源オフを決定した場合、アプリがデータベースにデータを書き込むという保証はありません。場合によっては、シャットダウンする前に最大 15 分間待ってみましたが、データが書き込まれることはありませんでした。私にとっては、データの書き込みが完了してコミットされることを常に保証したいと思っています。

実際の永続的なデータベースのための他のソリューション、または FF の実験的な追加を超えた IndexedDB の機能強化はありますか?

于 2016-10-19T15:21:44.483 に答える