0

IndexedDBの場合、objectStoresにデータを提供するさまざまなAjaxリクエストをプルしています。トランザクションは非同期であるため、objectStoresの作成をどのように連鎖させる必要がありますか?私はそれをこのようにすることを考えています:

1-スクリプトの先頭にあるすべてのAjaxリクエストをプルします。

2-DBを開くように要求します。

3-成功ハンドラーで最初のトランザクションを開いて最初のobjectStoreを作成し、それぞれのデータを挿入します。

4-最初のトランザクションでoncompleteイベントを呼び出して、2番目のトランザクションを作成します。

5-作成する必要があるすべてのobjectStoreに対してこれを実行します。

これが最善の方法ですか、それともindexedDB.openリクエストの成功ハンドラー内にすべてのトランザクションを書き込む必要がありますか?

エラーを発生させることなく、さまざまなobjectStoreを作成し、同時に大量のデータを挿入できますか?

4

2 に答える 2

2

1つのトランザクションですべてを行うことができます。トランザクションを開く場合は、このトランザクションのスコープを定義します。スコープは、複数のオブジェクトストアから存在できます。ターゲットにするオブジェクトストアのすべての名前の配列を提供することによって。

var transaction = db.transaction(["obj1", "obj2"]);
于 2012-09-28T11:17:56.320 に答える
1

私の経験では、トランザクションはAJAX応答を待つときに閉じる傾向があるため、AJAX応答の成功ハンドラーでトランザクションを開く必要があります。

複数の重複するトランザクションを並行して「実行」することには間違いなく問題はありませんが、実際にはJavaScriptはシングルスレッドのままです。AJAXサクセスハンドラーでさえ順番に実行され、順序はかなり予測可能です(保証されていません)。したがって、それぞれでトランザクションを開き、一連のプットでデータを処理すると、実際に表示されるのは次のとおりです。

openAjax1()
openAjax2()
ajax1Complete()
  // in here, open transaction1 and call objectStore1.put() many times
ajax2Complete()
  // in here, open transaction2 and call objectStore2.put() many times
put()  // from ajax1
put()  // from ajax1
put()  // from ajax1
...    // from ajax1
       // transaction1 completes
put()  // from ajax2
put()  // from ajax2
put()  // from ajax2
...    // from ajax2
       // transaction2 completes

理論的には、実際に並行して物事を実現する唯一の方法はワーカースレッドを使用することですが、それでもほとんどの実装は作業を単一のスレッドに集中させます。実際には、バックエンドは「一括」書き込みを一緒に最適化するのに非常に優れているため、ワーカーを使用してもパフォーマンスが大幅に向上することはありません。

于 2012-10-01T18:47:10.617 に答える