12

indexedDBには、インデックス付きデータベースに同期的にアクセスできるという仕様がありますが、まだ実装されていません。

手動で同期させる方法があるのだろうかと思っていましたが、

私のJavaScriptは次のようになります。

var trans = databaseAsync.transaction(["mapTile"], IDBTransaction.READ_WRITE);
var store = trans.objectStore("mapTile");
var keyRange = IDBKeyRange.bound(evt.data[0], evt.data[0]);
var cursorRequest = store.openCursor(keyRange);

// can you put some kind of wait in here?

cursorRequest.onsuccess = function(e)
{
    var result = e.target.result;
    if(!!result == false)
    {
    }
}

では、成功メソッドが呼び出されるまで待機させてから続行するために、そこに何かを入れることができますか?

これを実行したい理由は、上記のコードがこのメソッド内にラップされているためです。

dojo.extend(esri.layers.ArcGISTiledMapServiceLayer, {
      getTileUrl : function(level, row, col)
      {
          // blah
          return url;
      }

つまり、これはESRIタイルレイヤー(私のWebページのマップにタイルをロードします)であり、そのメソッドは特定のタイルのURLをすぐに返す必要があります。画像がまだデータベースにキャッシュされていない場合は、画像を読み込むためのURLになるか、これが

data:image;base64,*BASE64DATA*

ここで、 BASE64DATAは、以前にキャッシュされた場合のデータベースからのデータです。

以前はこれにlocalStorageを使用していましたが、これは同期的に機能しますが、5 MBの制限があるため、indexedDBを試してみようと思いました。

4

4 に答える 4

3

IndexedDB Sync APIは、IndexedDB仕様の危険な部分としてマークされており、実装が不足している可能性があるため、削除される可能性があります。

次のアクションを開始する前に現在のアクションが終了することを保証する「oncomplete」トランザクションイベントを使用して「sync」ソリューションを実装しました。また、GUIからの非同期呼び出しを処理し、2が開くことを保証するカスタムセマフォキューロジックを使用します。 IndexedDBデータベースへの接続は同時に発生しません。

于 2012-08-29T13:31:13.553 に答える
3

これを行うエレガントな方法は、私が数か月前に尋ねたこの質問に対する受け入れられた回答で提供されています。残念ながら、これは Firefox でのみサポートされている JavaScript 1.7 (ジェネレーター) の機能に依存しています。願わくば、いつの日かこの手法がより広くサポートされるようになることを願っています。

于 2012-08-29T14:44:50.043 に答える
2

答えが見つかる非同期関数を待機する方法について、より一般的な質問があります: JavaScript で非同期関数をブロックする方法

また、 Trial Tool内に素敵な waitFor ルーチンを見つけました。

于 2012-02-26T10:25:48.297 に答える
0

IE10 は同期 API をサポートしていますが、indexeddb 同期 API は Web ワーカー内でのみ使用できます。UI スレッドで作業している場合は、非同期 API を使用する必要があります。

非同期 API を操作する最も簡単な方法は、Promise を使用することです。

于 2012-08-13T06:12:53.023 に答える