4

a、b、c の 3 つのプロパティを持つデータをローカルにキャッシュしている IndexedDB があります。a と b が一緒になって複合キーを形成し、c は私が求めているコンテンツです。

これで、クライアントはサーバーから表示したいアイテムのリストを取得します。次に、クライアントは IndexedDB で (a,b) を検索し、一致する c を取得し、sha1 を使用して c をハッシュする必要があります (Rusha を使用すると、これは既に正常に機能しています)。

sha1(c_client) が sha1(c_server) と一致しないアイテムの場合、クライアントはサーバーからすべての (a,b) ペアを取得します ((a,b) の JSON シリアル化配列を含む 1 つの GET 要求を使用)。サーバーは c の更新されたコンテンツを返し、クライアントは新しい c を IndexedDB に格納してから、オブジェクトの配列全体を表示関数に渡します。

ご覧のように、ロジックの大部分は絶対に順次操作を必要としますが、IndexedDB は高度に非同期です。

私が望むことを同期的に行う方法はありますか?

4

2 に答える 2

1

コールバックに対する私のアプローチは、パブリッシュ サブスクライブ パターンIndexedDBを使用したイベント ディスパッチでした。独自のハンドラーをコーディングするか、JQuery トリガーを使用できます。

私が行ったことは、すべての論理IndexedDBイベントをグループ化し、IndexedDBコールバックが発生すると、発生したイベントの種類をパブリッシャーに通知し、パブリッシャーはそのイベントを待っているすべての関数に通知します。

私が持っているイベントの例は次のとおりです。データベースの作成、インデックス作成の完了、同期の開始、同期の完了...ユーザーに進行状況を通知するために使用される同期の進行状況のイベントもあります (バッチで同期しています)。

パブリッシュ/サブスクライブ モデルにより、IndexedDBコードと UI コードを高レベルで分離できるため、イベント アクション コードを簡単に変更したり、同じイベントにリスナーを追加したりできます。シーケンシャルな機能が必要な場合は、イベントを連鎖させることができます。1 つのイベントがトリガーを終了すると、それが完了し、次のイベントを続行できます。

于 2014-01-24T22:53:29.867 に答える
0

IndexedDB API の同期バージョンは、仕様が確定する前に放棄されたため、常に非同期で作業する必要があります。

API にも悩まされていたので、クエリに Promises を使用するdb.jsという単純なラッパーを作成しました。幸運にも、ジェネレーターをサポートするプラットフォームのみをターゲットにしている場合は、ジェネレーターを db.js と組み合わせて同期性を高めることができます。

于 2014-01-29T04:36:40.490 に答える