2012-06-22 61 views
5

私はのIndexedDBトランザクションが終了するか、成功したときに応答するコールバックのための2つの異なるイベントを使用します。IDBTransactionオブジェクト、OS::IDBObjectStoreオブジェクトIndexeddb:onsuccessとoncompleteの違いは?

tr = db.transaction(os_name,'readwrite'); 
os = tr.objectStore(); 
...さんは言ってみましょう

デシベル:IDBDatabaseオブジェクト、TR

ケース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(); 

どちらも同じように働くのは無駄です。あなたは私に教えてください、彼らの間に違いはありますか?

+0

これは素晴らしい質問です... FF実験的なアドオンを超えたのIndexedDBにあり、他の本当の永続的なデータベースのためのソリューション、または拡張機能です – buley

答えて

8

それは本当だが、これらのコールバックは、同様に、彼らは同じではありません機能:onsuccessoncompleteとの違いは、取引completeが、これらの取引に行われた要求は、successfulであるということです。

oncompleteは、取引に関連してthe specにのみ定義されています。トランザクションにonsuccessコールバックがありません。

+0

あなたは、トランザクションが完了したとき、それは意味しないことを意味しました処理全体は成功していますか? – Dagon

+2

はい、トランザクションが有効範囲外になり、私が探していたものだけが – buley

8

かなり古いスレッドを上げ、それは疑問だ申し訳ありませんが、良い出発点である...

私は同様の質問には、少し異なるユースケースに見て、実際には良い答えを見つけていないか、しました誤解を招くようなものさえも。

を複数のオブジェクトストアに数えてと書き込む必要がある場合を考えてみましょう。あなたは間違いなくがそれぞれの書き込みを管理することを望ましくなく、それ自身の成功とエラーイベントです。これは、トランザクションの意味であり、これはの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 specの次のステートメントで発見される:

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

我々は、データがあるtrx.oncompleteに問題があることを見ている:私は唯一の成功trx.oncompleteを取得すると、データをディスク/データベースに書き込まれたことを意味していること何garenteeがないことを警告するでしょう

+0

であることを意味します。私はobjectStore.onsuccessと仮定し、objectStore.oncompleteは複数の.add、。 get、.putなど...指定されたオブジェクトストアで。 –

2

ディスク上のdbに書き込まれません。 FireFoxは、ここでこの問題の原因となった原因について説明しています。https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction/oncomplete

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

関連する問題