7

私のコードは次のようなものです。

...
var f1 = function(trans) {
  var store = trans.objectStore('ObjectStore');
  store.clear();
};
var f2 = function(trans) {
  var store = trans.objectStore('ObjectStore');
  store.add({id: 1, data: 'text'});
};
...
var trans = DB.connection.transaction(['ObjectStore'], IDBTransaction.READ_WRITE);
trans.onerror = function() { alert('ERROR'); };
trans.oncomplete = function() { alert('DONE'); };
...

clear2番目のリクエスト例外の直後とオンでDONEアラートを受け取るという問題が発生します。

IndexedDBでトランザクションを「再利用」することは可能ですか?

UPD:上記のコードは、最新のChromiumナイトリービルドで期待どおりに機能することがわかりました。

4

1 に答える 1

5

IndexedDBのMozilla開発者および共同仕様ライターであるJonasSickingによると、最後のコールバックが発生したときにトランザクションがコミットされます。したがって、トランザクションを存続させるには、連続するコールバックを介してトランザクションを再利用できる必要があります。

oncomplete上記を使用していますが、onsucess同様に機能するはずです。

トランザクションオブジェクトは、コールバック時に返されるリクエストオブジェクトの属性として見つけることができます。

次の文は正しくありません。「今日のトランザクションは、トランザクション変数がスコープ外になり、それに対してリクエストを送信できなくなったときに自動コミットします」。

変数がスコープ外になったときにトランザクションが自動的にコミットされることはありません。通常、最後の成功/エラーコールバックが発生し、そのコールバックがそれ以上の要求をスケジュールしない場合にのみコミットします。したがって、変数のスコープとは関係ありません。

これに対する唯一の例外は、トランザクションを作成したが、それに対してリクエストを行わなかった場合です。その場合、イベントループに戻るとすぐに、トランザクションは「コミット」されます(要求のないトランザクションの場合は何でも)。このシナリオでは、トランザクションへのすべての参照が範囲外になるとすぐにトランザクションを技術的に「コミット」できますが、最適化するのに特に興味深いユースケースではありません。

以下の仕様例に基づいて、でトランザクションオブジェクトを見つけることができるはずです。evt.transactionまた、新しいトランザクションを実行して、新しいonsuccessイベントリスナーを追加できます。

 var request = indexedDB.open('AddressBook', 'Address Book');
 request.onsuccess = function(evt) {...};
 request.onerror = function(evt) {...};
于 2012-05-07T18:14:20.717 に答える